??? Error using ==> times Matrix dimensions must agree

I'm trying to process image using this ssim coding but i found that this error appear. I don't know where the error is. Can help me ? tq.
function [mssim, ssim_map] = ssim(img1, img2, K, window, L)
if (nargin < 2 | nargin > 5)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
if (size(img1) ~= size(img2))
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
[M N] = size(img1);
if (nargin == 2)
if ((M < 11) | (N < 11))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
window = fspecial('gaussian', 11, 1.5); %
K(1) = 0.01; % default settings
K(2) = 0.03; %
L = 255; %
end
if (nargin == 3)
if ((M < 11) | (N < 11))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
window = fspecial('gaussian', 11, 1.5);
L = 255;
if (length(K) == 2)
if (K(1) < 0 | K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end
if (nargin == 4)
[H W] = size(window);
if ((H*W) < 4 | (H > M) | (W > N))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
L = 255;
if (length(K) == 2)
if (K(1) < 0 | K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end
if (nargin == 5)
[H W] = size(window);
if ((H*W) < 4 | (H > M) | (W > N))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
if (length(K) == 2)
if (K(1) < 0 | K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end
img1 = double(img1);
img2 = double(img2);
% automatic downsampling
f = max(1,round(min(M,N)/256));
%downsampling by f
%use a simple low-pass filter
if(f>1)
lpf = ones(f,f);
lpf = lpf/sum(lpf(:));
img1 = imfilter(img1,lpf,'symmetric','same');
img2 = imfilter(img2,lpf,'symmetric','same');
img1 = img1(1:f:end,1:f:end);
img2 = img2(1:f:end,1:f:end);
end
C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
mu1 = filter2(window, img1, 'valid');
mu2 = filter2(window, img2, 'valid');
mu1_sq = (mu1.*mu1);
mu2_sq = (mu2.*mu2);
mu1_mu2 = (mu1.*mu2);
sigma1_sq = filter2(window, (img1.*img1), 'valid') - (mu1_sq);
sigma2_sq = filter2(window, (img2.*img2), 'valid') - (mu2_sq);
sigma12 = filter2(window, (img1.*img2), 'valid') - (mu1_mu2);
if (C1 > 0 & C2 > 0)
ssim_map = ((2*mu1_mu2) + C1).*((2*sigma12) + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
else
numerator1 = (2*mu1_mu2) + C1;
numerator2 = (2*sigma12) + C2;
denominator1 = mu1_sq + mu2_sq + C1;
denominator2 = sigma1_sq + sigma2_sq + C2;
ssim_map = ones(size(mu1));
index = (denominator1.*denominator2 > 0);
ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));
index = (denominator1 ~= 0) & (denominator2 == 0);
ssim_map(index) = numerator1(index)./denominator1(index);
end
mssim = mean2(ssim_map);
return

1 comentario

Walter Roberson
Walter Roberson el 27 de Abr. de 2012
As we do not have your input data, we don't know where the error is either.
You could help by indicating the exact line the error occurs on.
Have you tried using the debugger to figure out what the matrix sizes _are_ at the time?

Iniciar sesión para comentar.

Respuestas (1)

per isakson
per isakson el 28 de Abr. de 2012
See the page "Avoid Mistakes While Editing Code" in the documentation.
The Code Analyzer of the Matlab Editor works in the background and displays a summary in the Message Indicator in upper right corner of the editor pane. It works a bit like the spell checker in a word processor. Try to keep the Message Indicator green and understand that if it is red you have a problem.
Anyhow, there is syntax error in the following line
ssim_map = ((2*mu1_mu2) + C1).* ........
I fixed that and run your code with two versions of moon.tif. The function returned a meaningful result.
--- EDIT ---
The two first input arguments must have the same size. However, your code doesn't test that.
>> [mssim, ssim_map] = ssim(moon1,moon2(:,1:end-1));
Error using .*
Matrix dimensions must agree.
Error in ssim (line 105)
mu1_mu2 = (mu1.*mu2);

Categorías

Más información sobre Linear Algebra en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 27 de Abr. de 2012

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by