给定一个图像块,找出它在原图中的位置,无缩放,无旋转
----------------------------------------------------------------------------------------------
之前一直以为这个是个很难的事,主要是担心可能运算量会很大,要把图像块在整个图里滚一遍。
简单的思想是,为了提高速度,对图像块中心点和周围的几个点 在原图中移动比对,
如果误差小于阈值则加入可能的位置列表,
如果可能的位置过多(比如20个),则直接退出
如果要提高匹配准确率,可以增多比对的点数
Matlab
close all;
clear all;
clc;
im = imread('1.jpg');
im=imresize(im,0.5);
figure; imshow(im);
[m,n,c]=size(im);
im = im2double(im);
%点击选取一个图像块
[c, r] = ginput(1);
c = floor(c);
r = floor(r);
%图像块宽度
w = 6;
block_im = im(r-w:r+w, c-w:c+w, :);
err = 0;
%可能匹配的位置
pnts = [];
%匹配的图像块太多
too_many_match = 0;
for i=w:m-w
for j=w:n-w
err = sum(abs(im(i,j,:)-block_im(w, w,:)));
if err > 0.01
continue;
end
err = sum(abs(im(i-3,j-3,:)-block_im(w-3, w-3,:)));
if err > 0.01
continue;
end
err = sum(abs(im(i+3,j+3,:)-block_im(w+3,w+3,:)));
if err > 0.01
continue;
end
err = sum(abs(im(i-3,j+3,:)-block_im(w-3,w+3,:)));
if err > 0.01
continue;
end
err = sum(abs(im(i+3,j-3,:)-block_im(w+3,w-3,:)));
if err > 0.01
continue;
end
err = sum(abs(im(i+1,j-3,:)-block_im(w+1,w-3,:)));
if err > 0.01
continue;
end
pnts = [pnts; [i,j]];
%如果匹配的点太多,那么就要重新选择图像块
if size(pnts,1) > 20
too_many_match = 1;
break;
end
end
if 1 == too_many_match
break;
end
end
%pnts
[m,n,c]=size(im)
hold on;
len = size(pnts,1)
for i=1:len
plot(pnts(i,2), pnts(i,1), 'ro');
end
figure; imshow(block_im); title('图像块');
这个性能太差了:
据说用opensurf来做图像相似度比对是比较好的