首页 文章

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

提问于
浏览
1

我很难将图像像素转换为坐标并使它们出现在我的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 回答

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

    是图像上的零之一

  • 3

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

    [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
    

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

    >> 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 相同的结果 .

相关问题