让我说我有一张像那样的照片:
在快速搞砸之后,我得到了斧头的二进制图像,就像那样:
使用GNU / Octave获取图像轮廓的最简单/最快方法是什么?
答案 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);
输出:
答案 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答案中有一些不同之处:
这里我们得到图像中所有对象的边界。 bwboundaries
也会接受坐标作为输入参数,只选择一个对象,但我相信应该通过进一步处理你的掩码来完成工作(可能是由于jpeg工件)
因为我们获得了所有对象的边界,所以你得到一个带坐标的单元格数组。这就是为什么我们使用点来绘制边界(默认是线条,当它从一个对象跳到另一个对象时它将遍布整个图像)。此外,没有记录给定的坐标是否是连续边界,所以你不应该假设它(再次,为什么我们绘制点)。
读取的图像似乎有一些文物,我猜这是来自jpeg的保存。