2010-09-11 206 views
2

Existe-t-il un moyen de trouver l'erreur quadratique moyenne dans matlab entre 2 images A, B (disons) dans la couleur vraie de la dimension 256 * 256 * 3? La formule mathématique pour une matrice dire M1 et M2 est aussi sousComment trouver l'erreur quadratique moyenne dans matlab

mean sq err=1/n*n { summation (square[M1(i,j)-M2(i,j)])} 

où i représente rangée et j se dresse la colonne

+0

Avez-vous essayé les statistiques ou les boîtes à outils de conception de filtre?'aider ' – linuxuser27

Répondre

22

Eh bien, commencez à écrire! Mangez un éléphant de programmation (même les plus petits) un octet à la fois!

Comment formons-nous la différence de deux images? D'abord, convertissez-les en doubles au cas où ce sont des images uint8, comme c'est commun. FAIS LE! Essayez-le! Apprenez à écrire du code matlab en le faisant, et faites-le en morceaux, afin que vous puissiez suivre ce que vous avez fait. Tout d'abord, vous ne nous avez pas dit si cela devait être un MSE sur les trois canaux. Votre formule dit que nous devrions nous retrouver avec un MSE différent pour chacun des canaux rouges, verts et bleus.

double(M1) - double(M2) 

Maintenant, comment formeriez-vous le carré de chaque différence? Utilisez l'opérateur. ^. Ensuite, l'erreur quadratique moyenne implique que nous prenons la moyenne sur toutes les lignes et toutes les colonnes. Une manière simple de faire ceci est avec la fonction moyenne. Cet appel prend la moyenne sur les lignes.

mean((double(M1) - double(M2)).^2,2) 

Et le suivant prend la moyenne dans les colonnes.

mean(mean((double(M1) - double(M2)).^2,2),1) 

Le résultat sera un vecteur 1x1x3. Convertir cela en un vecteur 1x3 en utilisant la fonction remodeler. (La fonction de compression serait également souhaitable.) Emballage tout en une seule ligne, nous obtenons cette ...

MSE = reshape(mean(mean((double(M1) - double(M2)).^2,2),1),[1,3]); 

Si cela semble complexe pour vous, alors vous êtes mieux loti diviser en plusieurs lignes, avec des commentaires cela vous rappelle ce que vous avez fait pour plus tard.

Mais le fait est que vous créez une opération dans matlab en la décomposant en morceaux gérables.

EDIT:

Dans de nombreux cas, les gens veulent que le RMSE (racine quadratique moyenne erreur) qui a des unités les mêmes que vos numéros originaux. C'est juste la racine carrée de la MSE.

+1

Merci beaucoup .. aussi l'encouragement est apprécié. – gavishna

+0

Pourquoi l'index 2, autre que le terme carré, en moyenne ((double (M1) - double (M2)).^2,2) représente-t-il les lignes? Je veux dire dans matlab 1 représente des rangées et 2 représente la colonne ou est-ce l'inverse? – gavishna

+0

Bonne question. Ma formulation a pu être trompeuse. Si X est une matrice de forme NxMxP, somme (X, 2) forme une somme sur les colonnes de X, c'est-à-dire la SECONDE dimension de X, produisant un résultat de forme Nx1xP. –

4

erreur quadratique moyenne pour chaque canal indépendamment:

R1 = M1(:,:,1); 
G1 = M1(:,:,2); 
B1 = M1(:,:,3); 

R2 = M2(:,:,1); 
G2 = M2(:,:,2); 
B2 = M2(:,:,3); 

dR = int32(R1) - int32(R2); 
dG = int32(G1) - int32(G2); 
dB = int32(B1) - int32(B2); 

mseR = mean(dR(:).^2); 
mseG = mean(dG(:).^2); 
mseB = mean(dB(:).^2); 

Si cela fait partie d'un algorithme d'enregistrement d'image, vous voudrez peut-être supprimer le terme au carré:

R1 = M1(:,:,1); 
G1 = M1(:,:,2); 
B1 = M1(:,:,3); 

R2 = M2(:,:,1); 
G2 = M2(:,:,2); 
B2 = M2(:,:,3); 

dR = int32(R1) - int32(R2); 
dG = int32(G1) - int32(G2); 
dB = int32(B1) - int32(B2); 

errR = sum(abs(dR(:))); % 32bits sufficient for sum of 256x256 uint8 img. 
errG = sum(abs(dG(:))); 
errB = sum(abs(dB(:))); 

sumErr = errR + errG + errB; 

Pour des performances supplémentaires , vous pouvez également envisager de convertir en un seul canal et de réduire l'échantillonnage spatial, bien que l'efficacité dépende du contenu de l'image.

+0

Merci pour cette méthode aussi. N'est-il pas nécessaire de diviser le résultat de MSe par le nombre de points d'échantillonnage? Comme dans la formule mathématique réelle, il est divisé par n carré où n = nombre de points d'échantillonnage choisis au hasard. – gavishna

+0

même votre réponse est correcte, mais de toute façon je suis incapable de sélectionner les deux réponses comme les bonnes !! Peut être dans ce forum, nous ne pouvons pas accepter 2 réponses en même temps, je pense. – gavishna

+0

La division se produit dans l'appel à "mean". > I.e. moyenne == (somme (delta^2)/nPoints) –

1
a % your array1 
b %your array2 

m1=0; 

for i=1:N 
    m1=m1+(actual_effort(i)-Esti_effort1(i))^2; 

end 

RMSE1=sqrt((1/N)*m1); 
disp('Root Mean Square Error for Equation1=') 
RMSE1 
3
% MSE & PSNR for a grayscale image (cameraman.tif) & its filtered versions 
clear 
clc 
im=imread('cameraman.tif'); 
im=im2double(im); 
h1=1/9*ones(3,3); 
imf1=imfilter(im,h1,'replicate');% 'corr' 
h2=1/25*ones(5,5); 
imf2=imfilter(im,h2,'replicate');% 'corr' 

MSE1=mean(mean((im-imf1).^2)); 
MSE2=mean(mean((im-imf2).^2)); 
MaxI=1;% the maximum possible pixel value of the images. 
PSNR1=10*log10((MaxI^2)/MSE1); 
PSNR2=10*log10((MaxI^2)/MSE2); 
Questions connexes