提取分割图像轮廓的最简单方法是什么?

What's the easiest way to extract contour of segmented image?

假设我有一张这样的图片:

经过一番快速处理后,我得到了斧头的二进制图像,如下所示:

使用 GNU/Octave 获取该图像轮廓的 easiest/fastest 方法是什么?

您可以在图像包中使用bwtraceboundary。这是 Matlab 实现,但使用 Octave 应该非常相似:

首先估计起始像素以寻找边界,然后绘制(BW 是图像)。 (检查 here

dim = size(BW);
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)));

boundary = bwtraceboundary(BW,[row, col],'N');

imshow(BW)
hold on;
plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);

输出:

在 Octave 中您可以使用 bwboundaries(但我欢迎实现 bwtraceboundaries 的补丁)

octave:1> pkg load image;
octave:2> bw = logical (imread ("http://i.stack.imgur.com/BoQPe.jpg"));
octave:3> boundaries = bwboundaries (bw);
octave:4> boundaries = cell2mat (boundaries);
octave:5> imshow (bw);
octave:6> hold on
octave:7> plot (boundaries(:,2), boundaries(:,1), '.g');

这里与@Benoit_11的回答有一些不同:

  1. 这里我们得到了图像中所有对象的边界。 bwboundaries 也将接受坐标作为输入参数以仅选择一个对象,但我认为应该通过进一步处理您的掩码来完成工作(可能是由于 jpeg 工件)

  2. 因为我们得到了所有对象的边界,所以你得到了一个带有坐标的元胞数组。这就是我们使用点来绘制边界的原因(默认是线,当它从一个对象跳到另一个对象时,它会遍布整个图像)。此外,没有记录给定的坐标是否用于连续边界,因此您不应该假设它(同样,我们绘制点的原因)。

  3. 读取的图像似乎有一些伪影,我猜这是保存为 jpeg 格式造成的。