在Matlab中从轮廓中求坐标

在Matlab中从轮廓中求坐标,matlab,image-processing,curve-fitting,contour,Matlab,Image Processing,Curve Fitting,Contour,我想这并不困难,但我想知道是否有任何功能或任何最佳方式 考虑一下,经过图像处理后,我得到了一个到处都是0,轮廓是1的矩阵图像 现在我想沿着这条等高线找到xy 重要的是eg[x2 y2]应该是[x1 y1]的下一个像素 我用过这个: [c h]=轮廓图像,1 x=c1,: y=c2,: 但是结果不是很好,它给出了一些非常糟糕的噪声点,出于某种原因,它看起来像镜像的如果你有图像处理工具箱,我强烈建议使用它返回一个逻辑图像,其中true是周长或轮廓点,false不是。。。。更不用说它更快了 试着做:

我想这并不困难,但我想知道是否有任何功能或任何最佳方式

考虑一下,经过图像处理后,我得到了一个到处都是0,轮廓是1的矩阵图像

现在我想沿着这条等高线找到xy 重要的是eg[x2 y2]应该是[x1 y1]的下一个像素

我用过这个:

[c h]=轮廓图像,1

x=c1,: y=c2,:


但是结果不是很好,它给出了一些非常糟糕的噪声点,出于某种原因,它看起来像镜像的

如果你有图像处理工具箱,我强烈建议使用它返回一个逻辑图像,其中true是周长或轮廓点,false不是。。。。更不用说它更快了

试着做:

bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw);
第一行代码查找只包含轮廓点的图像,我们可以在结果上使用find after来查找行和列的位置。这里y代表行,x代表列位置

如果希望轮廓有序,则使用该函数。但是,这需要在运行函数之前指定初始轮廓点

一个简单的方法是沿着对象的轮廓找到任何非零点。您可以先使用bwperim,然后从这里采样任何点。仅选择任何一点可能不会给出实际的轮廓点

因此:

bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw, 1); % Find the first contour point
ctr = bwtraceboundary(image == 1, [y, x], 'SE');

“SE”是指给定初始轮廓点时首先查看的方向。在这里,我选择了东南部。这将生成一个N x 2矩阵,其中第一列包含行,第二列包含从y和x提供的初始位置开始的有序轮廓点列。

如果您有图像处理工具箱,我强烈建议使用它返回一个逻辑图像,其中true是周长或轮廓点,false是其他。。。。更不用说它更快了

试着做:

bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw);
第一行代码查找只包含轮廓点的图像,我们可以在结果上使用find after来查找行和列的位置。这里y代表行,x代表列位置

如果希望轮廓有序,则使用该函数。但是,这需要在运行函数之前指定初始轮廓点

一个简单的方法是沿着对象的轮廓找到任何非零点。您可以先使用bwperim,然后从这里采样任何点。仅选择任何一点可能不会给出实际的轮廓点

因此:

bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw, 1); % Find the first contour point
ctr = bwtraceboundary(image == 1, [y, x], 'SE');

“SE”是指给定初始轮廓点时首先查看的方向。在这里,我选择了东南部。这将生成一个N x 2矩阵,其中第一列包含行,第二列包含从y和x提供的初始位置开始的有序轮廓点列。

我发布了我的完整解决方案,以帮助其他人:

问题:

我有一个灰度图像,我想沿着轮廓找到坐标xy

解决方案:

设置黑白阈值,并使图像二进制可选

`image=image>0.5 %This is optional but some may found it usefull`
找到起点:

这将从左到右、从上到下逐列扫描图像,并返回第一个非零像素。因此,这将返回图像的“左上”像素。记住,X是列,Y是行。零在左上角

找到轮廓:

东北是东北的初始方向

x=contour(:,2)
y=contour(:,1)
如果点[yStart xStart]不在图像的轮廓上,则此操作将不起作用

如果绘制将被镜像的x、y。这是因为坐标系中的零位于图像的左上角,而不是左下角。要正确执行此操作,您可以执行以下操作:

y=-y
y=y+abs(min(y))+1 % +1 is to avoid y=0

我已发布了帮助他人的完整解决方案:

问题:

我有一个灰度图像,我想沿着轮廓找到坐标xy

解决方案:

设置黑白阈值,并使图像二进制可选

`image=image>0.5 %This is optional but some may found it usefull`
找到起点:

这将从左到右、从上到下逐列扫描图像,并返回第一个非零像素。因此,这将返回图像的“左上”像素。记住,X是列,Y是行。零在左上角

找到轮廓:

东北是东北的初始方向

x=contour(:,2)
y=contour(:,1)
如果点[yStart xStart]不在图像的轮廓上,则此操作将不起作用

如果绘制将被镜像的x、y。这是因为坐标系中的零位于图像的左上角,而不是左下角。要正确执行此操作,您可以执行以下操作:

y=-y
y=y+abs(min(y))+1 % +1 is to avoid y=0

find将按索引顺序对像素进行排序,而不会跟踪轮廓。是这里要使用的函数。@CrisLuengo我没有意识到OP命令
ints。我不这么认为,但我会加上这个。谢谢你们两位!我使用MatlabR2016a,所以这不起作用,用它代替:轮廓=bwtraceboundaryimage,[y,x],'SE'或轮廓=bwtraceboundaryimage,[yx],'SE',8,Inf,'逆时针';find将按索引顺序对像素进行排序,而不会跟踪轮廓。是这里要使用的函数。@CrisLuengo我没有意识到OP想要的有序点。我不这么认为,但我会加上这个。谢谢你们两位!我使用MatlabR2016a,所以这不起作用,用它代替:轮廓=bwtraceboundaryimage,[y,x],'SE'或轮廓=bwtraceboundaryimage,[yx],'SE',8,Inf,'逆时针';