Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 图像的MATLAB-SSIM计算_Image_Matlab_Ssim - Fatal编程技术网

Image 图像的MATLAB-SSIM计算

Image 图像的MATLAB-SSIM计算,image,matlab,ssim,Image,Matlab,Ssim,我正在搜索一个aulgorithm来查找两幅图像之间的相似性,我找到了SSIM,甚至还有如下代码: function [mssim, ssim_map] = SSIM(img1, img2, K, window, L) if (size(img1) ~= size(img2)) ssim_index = -Inf; ssim_map = -Inf; return; end [M N] = size(img1); if (nargin == 2) if ((M <

我正在搜索一个aulgorithm来查找两幅图像之间的相似性,我找到了SSIM,甚至还有如下代码:

function [mssim, ssim_map]  = SSIM(img1, img2, K, window, L)
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

C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
img1 = double(img1);
img2 = double(img2);

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

img1=imread (image1);
img2=imread (image2);
[mssim ssim_map] = SSIM(img1, img2);
函数[mssim,ssim_map]=ssim(img1,img2,K,window,L)
if(尺寸(img1)~=尺寸(img2))
ssim_索引=-Inf;
ssim_map=-Inf;
返回;
结束
[mn]=尺寸(img1);
if(nargin==2)
if((M<11)| |(N<11))
ssim_索引=-Inf;
ssim_map=-Inf;
返回
结束
窗口=f特殊('gaussian',11,1.5);%
K(1)=0.01;%默认设置
K(2)=0.03;%
L=255;%
结束
C1=(K(1)*L)^2;
C2=(K(2)*L)^2;
窗口=窗口/总和(总和(窗口));
img1=双(img1);
img2=双(img2);
mu1=过滤器2(窗口,img1,‘有效’);
mu2=过滤器2(窗口,img2,‘有效’);
mu1_sq=mu1.*mu1;
mu2_sq=mu2.*mu2;
mu1_mu2=mu1.*mu2;
sigma1_sq=过滤器2(窗口,img1.*img1,‘有效’)-mu1_sq;
sigma2_sq=filter2(窗口,img2.*img2,‘有效’)-mu2_sq;
sigma12=filter2(窗口,img1.*img2,‘有效’)-mu1\U mu2;
如果(C1>0&&C2>0)
ssim_-map=((2*mu1_-mu2+C1)。*(2*sigma12+C2))/((mu1_-sq+mu2_-sq+C1)。*(sigma1_-sq+sigma2_-sq+C2));
其他的
数值1=2*mu1_mu2+C1;
数值2=2*sigma12+C2;
分母1=mu1_sq+mu2_sq+C1;
分母2=sigma1_sq+sigma2_sq+C2;
ssim_图=个(大小(mu1));
指数=(分母1.*分母2>0);
ssim_图(索引)=(数字1(索引)。*数字2(索引))/(分母1(索引)。*分母2(索引));
指数=(分母1~=0)和(分母2==0);
ssim_映射(索引)=数值1(索引)。/分母1(索引);
结束
mssim=平均值2(ssim_图);
返回
img1=imread(图像1);
img2=imread(图像2);
[mssim ssim_map]=ssim(img1,img2);
我可以从这个源代码中得到一些值,但是我是否可以知道这种方法是否适用于旋转情况,例如我旋转到一定程度的一幅图片,并且这种方法是否会检测到旋转图像和原始图像具有相同的形状


非常感谢,请帮帮我

SSIM不是旋转不变的。也就是说,如果ImgA是ImgB的旋转版本,则SSIM(ImgA,ImgB)不太可能高。
因此,如果您想检测ImgA和ImgB之间的相对旋转角度,您必须将ImgA旋转到所有可能的角度,并将旋转后的版本与ImgB进行比较。
这不是一种非常有效的方法,您可能会发现其他更有效的方法来检测旋转


如果我没记错的话,您主要处理的是封闭曲线的二进制掩码。我相信,在您的情况下,旋转检测的更好选择是使用旋转不变量版本的形状上下文描述符,并结合一些健壮的刚性变换估计方法(如Ransac)。

非常感谢,顺便说一句,我将对SSIM进行研究,它是否可以比较具有相同图案形状但图案大小不同(一个非常小,一个非常大,但相同)的两幅图像,SSIM是否可以返回该情况的正确相似度值?谢谢lot@user2753594AFAIK ssim设计用于比较图像的噪声/模糊版本,而不是设计用于克服几何变换,如平移比例和/或旋转。您可能希望对这些类型的变形使用不同的相似性度量。