??? 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 个评论
Walter Roberson
2012-4-27
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?
回答(1 个)
per isakson
2012-4-28
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);
类别
在 帮助中心 和 File Exchange 中查找有关 Linear Algebra 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!