首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对两幅图像进行叠加,得到这两幅图像的相似指数?

如何对两幅图像进行叠加,得到这两幅图像的相似指数?
EN

Stack Overflow用户
提问于 2022-02-24 08:47:25
回答 2查看 248关注 0票数 0

我有一个干净的图像和一个嘈杂的图像。我创建了一个去噪器,并将它应用于噪声图像,这是我最后的输出。现在,为了比较这个图像接近干净图像的程度,我需要使用PSNR和SSIM进行比较,但是由于图像的不同位置,我无法进行比较。

现在我得到的SSIM为0.5,这是非常低,因为不适当的位置,这两个图像。如果图像被正确地注册,那么我想SSIM应该会出现在0.80+上。但我未能做到这一点。

如何对齐这两个图像以获得一个良好的SSIM值?

我有两个硬币图像,第一个图像(干净),第二个图像(改进了一个噪声IMG),作为比较。

清洁Img:

噪音Img:

由于图像在不同位置的位置,ssim(img1,img2)给出了不正确的输出。我试过种庄稼,但没有用。以下是我到目前为止尝试过的:

尝试1:

代码语言:javascript
复制
function [valPSNR,valSSIM,badpict]=getSSIM(clean_img,img2)
% pad reference image since object is so close to edges
refpict = padarray(mat2gray(clean_img),[20 20],'replicate','both');
% crop test image down to extract the object alone
badpict = imcrop(mat2gray(img2),[2.5 61.5 357 363]);
% maximize normalized cross-correlation to find offset
szb = size(badpict);
c = normxcorr2(badpict,refpict);
[idxy idxx] = find(c == max(c(:)));
osy = idxy-szb(1);
osx = idxx-szb(2);
% crop the reference pict to the ROI
refpict = refpict(osy:idxy-1,osx:idxx-1);
%imshow(imfuse(badpict,refpict,'checkerboard'));
%imagesc(badpict);
valSSIM=ssim(badpict,refpict);
valPSNR=getPSNR(badpict,refpict);
img2=badpict;
clean_img=refpict;
figure; imshowpair(clean_img,img2);
figure; montage({mat2gray(clean_img),mat2gray(img2)}, 'Size', [1 2], 'BackgroundColor', 'w', 'BorderSize', [2 2]);
end

尝试2:

代码语言:javascript
复制
function [valPSNR,valSSIM,badpict]=getSSIM2(clean_img,img2)
% pad reference image since object is so close to edges
bw1 = im2bw(mat2gray(clean_img));
bw2 = imclose(im2bw(mat2gray(img2),0.3),strel('disk',9));
bw2 = bwareafilt(bw2,1);
% make same size
[r,c] = find(bw1);
clean_img = clean_img(min(r):max(r),min(c):max(c));
[r,c] = find(bw2);
img2 = img2(min(r):max(r),min(c):max(c));
img2= imresize(img2, size(clean_img),'bilinear');
valPSNR=getPSNR(mat2gray(clean_img),mat2gray(img2));
valSSIM=ssim(mat2gray(clean_img),mat2gray(img2));
badpict=img2;
figure; imshowpair(clean_img,img2);
figure; montage({mat2gray(clean_img),mat2gray(img2)}, 'Size', [1 2], 'BackgroundColor', 'w', 'BorderSize', [2 2]);
end
EN

回答 2

Stack Overflow用户

发布于 2022-03-02 14:37:21

正如其他人所指出的,注册所需的重采样将有一些非零错误.但是,这里有一些示例代码,它将带您完成注册部分,这是您问题的关键所在。

代码语言:javascript
复制
% SSIM isn't defined on RGB images, convert to grayscale.
ref = rgb2gray(imread('https://i.stack.imgur.com/tPKEJ.png'));
X = rgb2gray(imread('https://i.stack.imgur.com/KmU4y.png'));

% The input image data has bright borders at the edges that create
% artifacts in resampling, best to just crop those or maybe there are
% aquisitions that don't have these borders?
X = X(3:end-2,3:end-2);
ref = ref(4:end-3,4:end-3);

figure
montage({X,ref});

tform = imregcorr(X,ref,"translation");

Xreg = imwarp(X,tform,OutputView=imref2d(size(ref)),SmoothEdges=true);

figure
imshowpair(Xreg,ref)

ssim(Xreg,ref)
票数 1
EN

Stack Overflow用户

发布于 2022-05-10 04:05:17

也许你可以参考我的github

我用OpenCV实现了一个模板匹配算法,您可以使用基于NCC的模式匹配来查找目标,然后得到评分(相似度)。

然后你可以用这个分数来判断它是否干净。

此外,转换c++代码可能是一个问题,但只需找到所有对应的函数在matlab版本。

以下是效果(红色区块是与黄金样本相比,相似性高于阈值0.85的区域):

整个功能太长了,不能在这里张贴。职能的一部分:

代码语言:javascript
复制
for (int i = 0; i < iSize; i++)
{
    Mat matRotatedSrc, matR = getRotationMatrix2D (ptCenter, vecAngles[i], 1);
    Mat matResult;
    Point ptMaxLoc;
    double dValue, dMaxVal;
    double dRotate = clock ();
    Size sizeBest = GetBestRotationSize (vecMatSrcPyr[iTopLayer].size (), pTemplData->vecPyramid[iTopLayer].size (), vecAngles[i]);
    float fTranslationX = (sizeBest.width - 1) / 2.0f - ptCenter.x;
    float fTranslationY = (sizeBest.height - 1) / 2.0f - ptCenter.y;
    matR.at<double> (0, 2) += fTranslationX;
    matR.at<double> (1, 2) += fTranslationY;
    warpAffine (vecMatSrcPyr[iTopLayer], matRotatedSrc, matR, sizeBest);


    MatchTemplate (matRotatedSrc, pTemplData, matResult, iTopLayer);

    minMaxLoc (matResult, 0, &dMaxVal, 0, &ptMaxLoc);

    vecMatchParameter[i * (m_iMaxPos + MATCH_CANDIDATE_NUM)] = s_MatchParameter (Point2f (ptMaxLoc.x - fTranslationX, ptMaxLoc.y - fTranslationY), dMaxVal, vecAngles[i]);

    for (int j = 0; j < m_iMaxPos + MATCH_CANDIDATE_NUM - 1; j++)
    {
        ptMaxLoc = GetNextMaxLoc (matResult, ptMaxLoc, -1, pTemplData->vecPyramid[iTopLayer].cols, pTemplData->vecPyramid[iTopLayer].rows, dValue, m_dMaxOverlap);
        vecMatchParameter[i * (m_iMaxPos + MATCH_CANDIDATE_NUM) + j + 1] = s_MatchParameter (Point2f (ptMaxLoc.x - fTranslationX, ptMaxLoc.y - fTranslationY), dValue, vecAngles[i]);
    }
}
FilterWithScore (&vecMatchParameter, m_dScore-0.05*iTopLayer);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71249291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档