Image 如何使用MATLAB在大图像中找到小图像的位置?
我写了剧本,但剧本不起作用。我不知道它有什么bug。我测试了截屏功能。它起作用了。我的代码应该逐像素进行比较,并且在这一点上只比较红色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
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站点上显示一个页面,那么它有许多白色平滑区域,因此您有许多相同的区域,找到正确的匹配是一个问题。这有点过分,但您可以使用典型的图像注册方法。这里有一个适合你的问题。