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

时间:2015-03-09 19:16:35

标签: image octave contour

让我说我有一张像那样的照片:

Original image

在快速搞砸之后,我得到了斧头的二进制图像,就像那样: Extracted image

使用GNU / Octave获取图像轮廓的最简单/最快方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以在Image包中使用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);

输出:

enter image description here

答案 1 :(得分:2)

在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的保存。