0

我正在做一个项目,我想在其中提取给定图像的轮廓。我有两张图片;一个前景图像和一个背景图像。我对这些图像应用减法并设置一个条件,如果差异不等于零。然后我打印那个坐标值。这是我当前的代码:

I=imread('starObject.jpg')

B=rgb2gray(I);
imshow(I);

A=imread('starB.jpg');
C=rgb2gray(A);
[columns rows]=size(C) 
Diff(i,j)=B(i,j)-C(i,j);
if (Diff(i,j)>0||Diff(i,j)<0)
    fprintf('1st difference');
    disp(Diff(i,j));
end 
end
end
imshow(Diff);  

上面的代码打印像素的差值。我要坐标。我怎样才能做到这一点?

4

2 回答 2

2

在您上面的代码中,i并且j已经是像素坐标。对于打印,你可以使用这样的东西

[rows, columns] = size(C); %# rows are first!!
for i = 1 : rows
    for j = 1 : columns
        if (Diff(i,j) ~= 0)
            sprintf('(%d, %d)', i, j);
        end
    end
end

例如。

另一种方法是使用该find()函数,它可能看起来像这样

[r, c] = find(Diff ~= 0);
for idx = 1 : length(r)
    sprintf('(%d, %d)', r(idx), c(idx));
end

顺便说一句:在 Matlab 中使用和作为变量是一个非常非常糟糕的主意,因为您通常使用它来定义复数。不要惊讶,如果ij

x = 10 + 20*j

循环后不再起作用。

于 2012-08-29T06:44:53.607 回答
1

向量化你的代码。不要使用 for 循环来迭代坐标,它很慢,很丑,而且不是语言的编写方式。看看以下内容是否适合您。

A    = rgb2gray (imread ('starObject.jpg'));
B    = rgb2gray (imread ('starB.jpg'));
Diff = B - C;
inds = find (Diff);
sprintf ("Different at indexes: %i\n", inds);

如果要打印下标而不是线性索引,请使用ind2sub将一个转换为另一个或使用两个输出参数查找。例如:

[iRows, iCols] = find (Diff);
printf ("Different at coordinates (%i, %i)\n", [iRows'; iCols']);
于 2012-08-29T14:28:47.920 回答