使用matlab在图像上应用SAD

时间:2013-12-01 16:36:42

标签: image matlab templates image-processing

大家好我有原始图像,我裁剪了该图像的一部分(模板)并用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); 

1 个答案:

答案 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');