大家好我有原始图像,我裁剪了该图像的一部分(模板)并用SAD算法编写了一个代码,在原始图像上检测我裁剪的部分(模板),并在其上绘制一个矩形。
代码没有任何错误,但矩形绘图与模板不匹配,所以我猜'输出'变量是问题,请你帮帮我
I2=imread('img.PNG');
I2=rgb2gray(I2);
[r,c]= size(I2);
%padding the image
%padding
B = padarray(I2,[24 24],'replicate' ,'both');
%imshow(B);
%creating template
temp=imread('crop_img.PNG');
temp= rgb2gray(temp);
%imshow(temp)
size(temp)
output = zeros (size(I2));
K = size(temp)
x=1;
y=1;
for i = 25 : r-24
for j = 25: c-24
%dif = temp -I2(i:i+47,j:j+47) ;
K = imabsdiff(temp,B(i-24:i+24,j-24:j+24));
output(i-24, j-24) = sum (K(:));
end
end
%gettting min value in output
min_value = output(1,1)
for i=1 : r
for j=1 :c
if(output(i,j)<min_value)
min_value=output(i,j);
row=i;
col=j;
end
end
end
row
col
output(1,465)
output(6,200)
%draw rectangle on matching area
%Create the shape inserter object.
shapeInserter = vision.ShapeInserter;
%Define the rectangle dimensions as [x y width height].
rectangle = int32([row col 24 24]);
%Draw the rectangle and display the result.
J = step(shapeInserter, I2, rectangle);
imshow(J);
答案 0 :(得分:0)
图像坐标与矩阵坐标存在问题 - 您需要翻转行和列变量。另外,对于shapeInserter
,坐标是矩形的一角,所以为了使输出居中,你需要的东西是:
rectangle = uint8([col-12 row-12 24 24]);
在MATLAB中,通常不需要遍历图像的每个像素 - 一次处理整个图像效率更高。例如,您不需要循环:
min_value = output(1,1)
for i=1 : r
for j=1 :c
if(output(i,j)<min_value)
min_value=output(i,j);
row=i;
col=j;
end
end
end
这可以替换为:
min_value = min(output(:));
[row,col] = find(output==min_value,1,'first');