我同意amgaera。如果要查找轮廓,Python中的OpenCV是可以使用的最佳工具之一。与他/她的帖子一样,请使用
findContours方法并使用
RETR_EXTERNAL标志来获取形状的最外轮廓。这里有一些可复制的代码供您说明这一点。您首先需要安装OpenCV并
NumPy继续进行。
我不确定您使用的平台是什么,但是:
- 如果您使用的是Linux,只需执行
apt-get
onlibopencv-dev
和python-numpy
(即sudo apt-get install libopencv-dev python-numpy
)。 - 如果您使用的是Mac OS,请先安装Homebrew,然后通过
brew install opencv
then进行安装brew install numpy
。 - 如果您使用的是Windows,最好的方法是通过Christoph Gohlke的非官方的Windows Python软件包:
http://www.lfd.uci.edu/~gohlke/pythonlibs/
-检查OpenCV软件包并安装其要求的所有依赖项,包括NumPy
您可以在此页面上找到的依赖项。
无论如何,我都会拍摄您的甜甜圈图像,然后只提取带有甜甜圈的图像。换句话说,我创建了此图像:
至于您的图像是PNG并具有Alpha通道,实际上并不重要。只要此图像中仅包含一个对象,我们实际上根本不需要访问alpha通道。下载该图像后,将其另存为
donut.png,然后继续运行以下代码:
import cv2 # import OpenCVimport numpy as np # import NumPy# Read in the image as grayscale - Note the 0 flagim = cv2.imread('donut.png', 0)# Run findContours - Note the RETR_EXTERNAL flag# Also, we want to find the best contour possible with CHAIN_APPROX_NONEcontours, hierarchy = cv2.findContours(im.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# Create an output of all zeroes that has the same shape as the input# imageout = np.zeros_like(im)# On this output, draw all of the contours that we have detected# in white, and set the thickness to be 3 pixelscv2.drawContours(out, contours, -1, 255, 3)# Spawn new windows that shows us the donut# (in grayscale) and the detected contourcv2.imshow('Donut', im) cv2.imshow('Output Contour', out)# Wait indefinitely until you push a key. once you do, close the windowscv2.waitKey(0)cv2.destroyAllWindows()让我们慢慢看一下代码。首先,我们导入OpenCV和NumPy软件包。我将NumPy导入为
np,如果您
numpy到处都看文档和教程,他们这样做是为了最大程度地减少打字。OpenCV和NumPy可以相互配合,这就是为什么您需要同时安装两个软件包的原因。然后,我们使用读取图像
imread。我将标志设置
0为使图像灰度使事情变得简单。加载图像后,我将运行
findContours,并且此函数的输出将输出包含两个内容的元组:
contours
-这是一个数组结构,可为您提供(x,y)
图像中检测到的每个轮廓的坐标。hierarchy
-这包含有关您检测到的轮廓的其他信息,例如拓扑,但是为了这篇文章,我们跳过此信息。
请注意,我指定
RETR_EXTERNAL要检测对象的最外轮廓。我还指定了
CHAIN_APPROX_NONE标志,以确保获得没有任何近似的完整轮廓。一旦检测到轮廓,我们将创建一个全黑的新输出图像。这将包含我们检测到的甜甜圈的外部轮廓。创建此图像后,我们将运行该
drawContours方法。您指定要在其中显示轮廓的图像,之前创建的轮廓结构,并且
-1标志指示绘制图像中的所有轮廓。如果一切顺利,则应该只检测到一个轮廓。然后,指定希望轮廓显示的颜色。就我们而言,我们希望它是白色的。之后,指定要绘制轮廓的厚度。我选择了3像素的厚度。
我们要做的最后一件事是显示结果。我打电话
imshow来显示原始的甜甜圈图像是什么样(灰度)以及输出轮廓是什么样。
imshow故事还没有结束。除非您调用,否则您将看不到任何输出
cv2.waitKey(0)。这就是说,您可以无限期显示图像,直到您按下一个键为止。按下键后,
cv2.destroyAllWindows()呼叫将关闭所有已产生的窗口。
这就是我得到的(一旦您重新排列窗户以便它们并排放置):
另外,如果要 保存
图像,则只需运行
imwrite即可保存图像。您可以指定要写入的图像的名称以及要访问的变量。因此,您将执行以下操作:
cv2.imwrite('contour.png', out)然后,您将该轮廓图像保存到名为的文件中
contour.png。
这应该足以让您入门。
祝好运!



