Image 如何使用MATLAB在大图像中找到小图像的位置?

Image 如何使用MATLAB在大图像中找到小图像的位置?,image,matlab,Image,Matlab,我写了剧本,但剧本不起作用。我不知道它有什么bug。我测试了截屏功能。它起作用了。我的代码应该逐像素进行比较,并且在这一点上只比较红色 function [X,Y] = findImageXY(ImageName) X = 0; Y = 0; %Load the small image SmallImage = imread(ImageName); %Screen Capture the right screen ScreenImage1=ScreenCapture([1600,1,16

我写了剧本,但剧本不起作用。我不知道它有什么bug。我测试了截屏功能。它起作用了。我的代码应该逐像素进行比较,并且在这一点上只比较红色

function [X,Y] = findImageXY(ImageName)
X = 0;
Y = 0;


%Load the small image
SmallImage = imread(ImageName); 

%Screen Capture the right screen
ScreenImage1=ScreenCapture([1600,1,1600,900],'ScreenImage.bmp');
ScreenImage = imread('ScreenImage.bmp');


for ii = 1:size(ScreenImage,1) -  size(SmallImage,1) - 1
    for jj = 1:size(ScreenImage,2) - size(SmallImage,2) - 1
        X = 0;
        for i = 1:size(SmallImage,1) 
            for j = 1:size(SmallImage,2)
               if ScreenImage(ii+i,jj+j,1)~= SmallImage(i,j,1)
                   X = inf;
                   Y = inf;
                   break
               end
            end
            if isinf(X) == 1
                break
            end
        end
        if X == 0
            X = jj + ceil(size(SmallImage,2)/2);
            Y = ii + ceil(size(SmallImage,1)/2);
            break
        end
    end
    if X~=0 && isinf(X)~=1
        break
    end
end

查看normxcorr2文档中的示例:

值得考虑的是:如果您尝试在两个相似但数字不完全相同的图像上进行模板匹配,那么您将需要使用一种技术,如归一化互相关或相位相关,它对照明差异和噪声等具有鲁棒性。刚刚注意到@dafnahaktana在评论中指出了同样的事情

c = normxcorr2(SmallImage(:,:,1),ScreenImage(:,:,1));
[ypeak, xpeak] = find(c==max(c(:)));
YtopLeft = ypeak-size(SmallImage,1)+1;
XtopLeft = xpeak-size(SmallImage,2)+1;

您的代码假定子图像和较大的图像之间存在精确匹配,这在大多数现实世界的模板匹配问题中并不常见,因为在这些问题中经常存在噪声、照明差异等。

Hi,您可以使用函数
normxcorr2
获取索引,其中小图像与索引偏移中的大图像最相似。我认为这两幅图像中的值可能不完全相同,因此不能进行精确比较,但应该保持差异。但我认为最好使用
normxcorr2
。此外,如果屏幕上有很多平滑区域,那么在屏幕捕获图像的情况下,这取决于屏幕上的内容,例如,如果您的屏幕在stackoverflow站点上显示一个页面,那么它有许多白色平滑区域,因此您有许多相同的区域,找到正确的匹配是一个问题。这有点过分,但您可以使用典型的图像注册方法。这里有一个适合你的问题。