在 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
矩阵,其中第一列包含行,第二列包含从 y
和 x
.[=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
我想这不是什么难事,但我想知道是否有任何功能或优化方法。
考虑一下,在图像处理之后,我有一个矩阵图像,到处都是 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
矩阵,其中第一列包含行,第二列包含从 y
和 x
.[=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