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

时间:2017-08-26 06:19:10

标签: image matlab

我编写了脚本,但脚本不起作用。我不知道它有什么错误。我测试了screenCapture函数。有用。我的代码应该按像素进行比较,并且只比较此时的红色。

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

1 个答案:

答案 0 :(得分:-1)

请查看normxcorr2文档中的示例:

Eclipse Plug-in Development Environment (PDE)

值得思考:如果你要做的是在两个相似但不是数字相同的图像上进行模板匹配,那么你将需要使用像归一化的互相关或相位相关这样的技术差异和噪音。刚注意到@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;

您的代码假设子图像与较大图像之间存在精确匹配,这在大多数真实世界模板匹配问题中并不常见,其中经常存在噪声,光照差异等。