如何使用Python在图像中找到物体的形状

3
我想知道如何在图像中找到一个物体的形状并将其存储在变量中以供后续使用。例如,以下是一张图片: enter image description here 我想提取出仅仅是物体的轮廓线,就像这样(我在Photoshop中处理了该图像): enter image description here 我只需要图像的轮廓线,并且想要将其保存在磁盘上。目前我还没有尝试过,并且我正在使用Python 2.7。
欢迎任何建议。
谢谢!

4
我还没有尝试过。等你尝试后再回来。 - Tim
你可以尝试使用ImageMagic - http://www.imagemagick.org/Usage/photos/#color-in - Tanveer Alam
3个回答

8

我不建议对您的图像进行灰度处理。您似乎对红色花朵和绿色背景有兴趣。在图像中,一种简单明了的方式是确定那些红色值高于绿色值的像素与花朵相对应。

import cv2
from numpy import array    
img = cv2.imread('flower.jpg')
img2 = array( 200  * (img[:,:,2] > img[:,:, 1]), dtype='uint8')

img2清晰地显示了花的形状。若要仅获取边缘,请使用Canny边缘检测器:

edges = cv2.Canny(img2, 70, 50)
cv2.imwrite('edges.png', edges)

生成的文件edges.png如下所示:

enter image description here

如果您想要的话,下一步是提取边缘的坐标。可以使用以下代码实现:

contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

您可以在此处找到有关cv2.cannycv2.findContours的文档:这里这里

更多信息:如果使用灰度图像会发生什么:

img = cv2.imread('flower.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
gray1 = cv2.Canny(img, 70, 50)
cv2.imwrite('gray1.png', gray1)

生成的图像如下:

在此输入图片描述

灰度处理方法展示了花朵内部结构的许多细节,好与坏取决于您的目标。


看起来很简单,但是它对每张图片都适用吗?还是只适用于红绿对比的图片? - varsha_holla
1
@varsha_holla 在计算机视觉中,_没有真正通用的解决方案_。在这种情况下,如果你正在寻找绿色背景上的红花,红色和绿色可能具有相同的灰度值,使灰度无用,但使用红绿对比可以给你一个清晰的图像。另一方面,如果你正在寻找蓝天下的绿树,则绿蓝对比更有意义。如果你正在观察一个乏味的城市景观,在多云的日子里可能没有有用的颜色。你必须逐个案例来处理。 - John1024
为了说明问题,我只是添加了灰度结果:输出显示了花的许多内部结构。如果您对内部结构感兴趣,那么这是一件好事。如果您不感兴趣,那么就不是。 - John1024
我发现这个回答非常有帮助和指导性。我只想补充一点,在我的短暂经验中,findContoursimg2(如上所示)相比,使用 edges 效果更好。 - Daniel

2

由于您还没有尝试过,我建议您先试试:

以下是一些提示:

  • 将图像转换为灰度
  • 在numpy数组中保留灰度图像
  • 制作直方图以计算图像中的级别
  • 应用阈值以去除背景
  • 您可以尝试自适应阈值(在网上查找)
  • 应用边缘检测算法(如Canny)
  • 使用形态学数学方法(如侵蚀、膨胀)以获得更好的结果

这里有一些有用的信息:http://scipy-lectures.github.io/advanced/image_processing/



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接