我正在开展一个项目,我想在其中提取给定图像的轮廓。 我有两张照片;前景图像和背景图像。我对这些图像应用减法,如果差值不等于零,则设置条件。然后我打印该坐标值。这是我目前的代码:
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);
以上代码打印像素的差值。我想要坐标。我怎样才能做到这一点?
答案 0 :(得分: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中使用i
和j
作为变量是一个非常非常错误的想法,因为您通常使用它用于定义复数。如果
x = 10 + 20*j
循环后,不再起作用。
答案 1 :(得分: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']);