栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

处理图像以找到外部轮廓

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

处理图像以找到外部轮廓

我同意amgaera。如果要查找轮廓,Python中的OpenCV是可以使用的最佳工具之一。与他/她的帖子一样,请使用

findContours
方法并使用
RETR_EXTERNAL
标志来获取形状的最外轮廓。这里有一些可复制的代码供您说明这一点。您首先需要安装OpenCV并
NumPy
继续进行。

我不确定您使用的平台是什么,但是:

  • 如果您使用的是Linux,只需执行
    apt-get
    on
    libopencv-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


这应该足以让您入门。

祝好运!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号