在 Matlab 中从轮廓中查找坐标

Find coordinates from a contour in Matlab

我想这不是什么难事,但我想知道是否有任何功能或优化方法。

考虑一下,在图像处理之后,我有一个矩阵图像,到处都是 0,轮廓处是 1。

现在我想沿着那条等高线找到 x y 轴
重要的是,例如 [ x(2) y(2) ] 应该是 [x(1) y(1)][=30= 的下一个像素]

我用过这个:

[c h]=轮廓(图像,1)

x=c(1,:) y=c(2,:)

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

如果您有图像处理工具箱,我强烈建议使用 bwperim 其中 returns 一个 logical 图像,其中 true 是周长或轮廓点 false 否则....更不用说它更快了。

尝试做:

bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw);

第一行代码找到一个只包含轮廓点的图像,我们可以在结果上使用find之后的结果来找到行和列的位置。这里 y 代表行,x 代表列位置。

如果您希望轮廓有序,请改用bwtraceboundary函数。但是,这将要求您在 运行 函数之前指定一个初始轮廓点。

一个简单的方法是沿着对象的轮廓找到任何 non-zero 点。您可以先使用 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 矩阵,其中第一列包含行,第二列包含从 yx.[=27 提供的初始位置开始的有序轮廓点的列=]

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

问题:

我有一张灰度图像,我想沿着 轮廓 按顺序 找到坐标 X Y。

解法:

设置黑白阈值并使图像二值化(可选)

`image=image>0.5 %This is optional but some may found it usefull`

找到起点:

[yStart xStart]=find(image,1);

这将从左到右、从上到下逐列扫描图像,并将return第一个非零像素。所以这将 return 图像的 'left-est up' 像素。请记住,X 是列,Y 是行。零在 top-left 角!

求轮廓:

contour=bwtraceboundary(image, [yStart, xStart],'NE');

contour = bwtraceboundary(image,[yStart xStart],'NE',8,Inf,'clockwise');

NE为初始方向(NorthEast)

x=contour(:,2)
y=contour(:,1)

如果点 [yStart xStart] 不在图像的轮廓上,这将不起作用!

如果绘制 (x,y) 将被镜像。这是因为坐标系的零点在图像的左上角而不是左下角。要正确地做到这一点,你可以这样做:

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