将非零图像像素转换为行列坐标并将输出保存到工作区

时间:2015-04-08 06:29:50

标签: image matlab image-processing

我很难将图像像素转换为坐标并使它们出现在我的MATLAB工作区中。例如,我的图像像素值如下(它是一个大小为4x4的二进制图像):

0 0 0 0

0 1 1 0

0 1 1 0 

0 0 0 0

获取像素后,我想读取每个值,如果它们不等于零(表示1),我想读取该值的坐标并将它们保存到我的MATLAB工作区。例如,这是我想到的想法:

[x,y] = size(image)
for i=1:x
   for j=1:y
       if (image(i,j)~=0)
       ....

然而,我被卡住了。任何人都可以提出如何读取非零值坐标并将其保存到我的工作区的建议吗?

具体来说,我在工作区中的预期结果:

2 2

2 3

3 2

3 3

2 个答案:

答案 0 :(得分:3)

使用循环执行它可能不是最有效的方法来执行您的要求。相反,请使用findfind确定向量或矩阵中非零的位置。在您的情况下,您所要做的就是:

[row,col] = find(image);

rowcol将包含二进制图像中非零元素的行和列位置。因此,举个例子:

b = [0 0 0 0;
     0 1 1 0;
     0 1 1 0;
     0 0 0 0];

我们得到:

>> disp([row, col]);

 2     2
 3     2
 2     3
 3     3

但是,您会看到位置不符合您的预期。这是因为位置以列主要顺序显示,这意味着首先遍历列。在您的示例中,您将按行主顺序显示它们。如果您想维护此顺序,则可以按行坐标对结果进行排序:

>> sortrows([row, col])

ans =

     2     2
     2     3
     3     2
     3     3

然而,如果你真的真的真的...我的意思是真的...想要使用for循环,你要做的是保留两个最初为空的独立数组,然后遍历每个像素和确定它是否为非零。如果是,则将xy位置添加到这两个单独的数组中。

因此,你会这样做:

row = []; col = [];
[x,y] = size(image);
for i=1:x
   for j=1:y
       if (image(i,j)~=0)
           row = [row; i]; %// Concatenate row and column location if non-zero
           col = [col; j];
       end
   end
end

这应该会给你与find相同的结果。

答案 1 :(得分:1)

您可以使用meshgrid()来收集这些坐标。该函数生成两个输出,首先是x坐标,第二个是y坐标。你是这样的:

[xcoord ycoord] = meshgrid( 1:x_size, 1:y_size);

zeros_coordsx = xcoord( image == 0);
zeros_coordsy = ycoord( image == 0);

这比嵌套循环更快,让你在matlab的自然向量操作空间内...这两个输出是同步的,这意味着

image( zeros_coordsy(1), zeros_coordsx(1)) 

是图像上的零之一