我认为这不是困难但我想知道是否有任何功能或任何最佳方式。
考虑到在图像处理之后我有一个矩阵图像,其中0到处都是1,在轮廓处有1。
现在我想沿着该轮廓线找到x y
重要的是,例如 [x(2)y(2)] 应该是 [x(1)y(1)]的下一个像素
我用过这个:
[c h] =轮廓(图像,1)
X = C(1,:) Y = C(2,:)
但结果并不是很好,它会产生一些非常糟糕的噪点(并且由于某些原因它会显得很镜像)
答案 0 :(得分:5)
如果您有图像处理工具箱,我强烈建议您使用bwperim
返回logical
图像,其中true
是周长或轮廓点,否则false
。 ..更不用说它更快了。
尝试做:
bw = bwperim(image == 1); % image == 1 to ensure binary
[y, x] = find(bw);
第一行代码找到一个只包含轮廓点的图像,然后我们可以在结果上使用find
来查找行和列位置。此处y
代表行,x
代表列位置。
如果您希望轮廓有序,请改用bwtraceboundary
功能。但是,这将要求您在运行函数之前指定初始轮廓点。
一种简单的方法是沿着物体的轮廓找到任何非零点。您可以先使用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
提供的初始位置开始的有序轮廓点的列。
答案 1 :(得分:0)
我已经发布了完整的解决方案来帮助其他人:
问题:
我有一个灰度图像,我想沿轮廓找到 X Y依次的坐标。
解决方案:
设置黑白阈值并使图像成为二进制(可选)
`image=image>0.5 %This is optional but some may found it usefull`
找到起点:
[yStart xStart]=find(image,1);
这将逐列扫描图像,从左到右,从上到下,将返回第一个非零像素。因此,这将返回最左边的'图像的像素。请记住,X是列,Y是行。零位于左上角!
找到轮廓:
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