将非零图像像素转换为行列坐标并将输出保存到工作区
Convert non-zero image pixels to row-column coordinates and save the output to workspace
我在将图像像素转换为坐标并使它们出现在我的 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
用循环来做可能不是完成你所要求的最有效的方法。相反,请使用 find
。 find
确定向量或矩阵中的非零位置。在你的情况下,你所要做的就是:
[row,col] = find(image);
row
和 col
将包含二进制图像中非零元素的行和列位置。因此,以你的例子:
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
循环,你要做的是保留两个最初为空的单独数组,然后循环遍历每个数组像素并确定它是否非零。如果是,那么您可以将 x
和 y
位置添加到这两个单独的数组中。
因此,您可以这样做:
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
相同的结果。
您可以使用 meshgrid() 来收集这些坐标。该函数生成两个输出,第一个是 x 坐标,第二个是 y 坐标。你会这样:
[xcoord ycoord] = meshgrid( 1:x_size, 1:y_size);
zeros_coordsx = xcoord( image == 0);
zeros_coordsy = ycoord( image == 0);
这比嵌套循环要快得多,并且让您保持在 matlab 的自然向量运算中space...这两个输出是同步的,这意味着
image( zeros_coordsy(1), zeros_coordsx(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
用循环来做可能不是完成你所要求的最有效的方法。相反,请使用 find
。 find
确定向量或矩阵中的非零位置。在你的情况下,你所要做的就是:
[row,col] = find(image);
row
和 col
将包含二进制图像中非零元素的行和列位置。因此,以你的例子:
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
循环,你要做的是保留两个最初为空的单独数组,然后循环遍历每个数组像素并确定它是否非零。如果是,那么您可以将 x
和 y
位置添加到这两个单独的数组中。
因此,您可以这样做:
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
相同的结果。
您可以使用 meshgrid() 来收集这些坐标。该函数生成两个输出,第一个是 x 坐标,第二个是 y 坐标。你会这样:
[xcoord ycoord] = meshgrid( 1:x_size, 1:y_size);
zeros_coordsx = xcoord( image == 0);
zeros_coordsy = ycoord( image == 0);
这比嵌套循环要快得多,并且让您保持在 matlab 的自然向量运算中space...这两个输出是同步的,这意味着
image( zeros_coordsy(1), zeros_coordsx(1))
是图像上的零点之一