在matlab中打印图像的所选像素的x,y坐标

时间:2012-08-29 06:31:41

标签: matlab image-processing

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

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);  

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

2 个答案:

答案 0 :(得分:2)

在上面的代码中,ij已经是像素坐标。对于打印,您可以使用类似的东西

[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
循环后,

不再起作用。

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