9

我想提取图像的轮廓,我正在尝试使用 MatplotLib 的轮廓函数来完成它。这是我的代码:

from PIL import Image
from pylab import *

# read image to array
im = array(Image.open('HOJA.jpg').convert('L'))

# create a new figure
figure()

# show contours with origin upper left corner
contour(im, origin='image')
axis('equal')

show()

这是我的原图:

原来的

这是我的结果:

轮廓

但我只想展示外部轮廓,轮廓。只是这个例子中的读取行。

我该怎么做?我阅读了轮廓函数的文档,但我无法得到我想要的。

如果您知道在 Python 中执行此操作的更好方法,请告诉我!(MatplotLib、OpenCV 等)

4

3 回答 3

15

如果你想坚持你的轮廓方法,你可以简单地在白色背景和叶子之间添加一个带有“阈值”值的级别参数。

您可以使用直方图找到合适的值。但在这种情况下,任何略低于 255 的值都可以。

所以:

contour(im, levels=[245], colors='black', origin='image')

在此处输入图像描述

如果你想做一些严肃的图像处理,请务必检查 Scikit-Image。它包含几个边缘检测算法等。

http://scikit-image.org/docs/dev/auto_examples/

于 2012-11-27T15:29:13.990 回答
7

对于那些想要 OpenCV 解决方案的人,这里是:

ret,thresh = cv2.threshold(image,245,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

tam = 0

for contorno in contours:
    if len(contorno) > tam:
        contornoGrande = contorno
        tam = len(contorno)

cv2.drawContours(image,contornoGrande.astype('int'),-1,(0,255,0),2)

cv2.imshow('My image',image)

cv2.waitKey()
cv2.destroyAllWindows()

在这个例子中,我只画了最大的轮廓。请记住,“图像”必须是单通道数组。

您应该更改阈值函数、findContours 函数和 drawContours 函数的参数以获得您想要的。

我在 drawContours 函数中转换为“int”,因为 Open CV 2.4.3 版本中存在错误,如果不进行此转换,程序会中断。 这是错误

于 2013-01-09T08:39:37.907 回答
0

我建议使用 OpenCV 来提高性能。它有一个findContour函数,可以使用cv2绑定从 python 访问。该函数可以设置为只返回外部轮廓。

您还必须对图像进行阈值处理。

于 2012-11-27T16:42:07.327 回答