如何使用python在图像中查找对象的形状

如何使用python在图像中查找对象的形状,python,image,Python,Image,我想知道如何在图像中找到对象的形状并将其存储在变量中以供进一步使用。比如说, 我只想提取形状,像这样(我在photoshop中操纵了图像) 我只需要图像的轮廓,我想把它保存在磁盘上。到目前为止我还没有尝试过,我正在使用python 2.7 欢迎提出任何建议 提前谢谢 这里有很多教程,我想这个问题可能对你们有用 ,,,由于您还没有尝试任何东西,我建议您先尝试:) 以下是一些要点: 将图像转换为灰度 将灰度图像保存在numpy数组中 制作直方图以计算图像中的级别 应用阈值,以删除背景 您可以

我想知道如何在图像中找到对象的形状并将其存储在变量中以供进一步使用。比如说,

我只想提取形状,像这样(我在photoshop中操纵了图像)

我只需要图像的轮廓,我想把它保存在磁盘上。到目前为止我还没有尝试过,我正在使用python 2.7

欢迎提出任何建议


提前谢谢

这里有很多教程,我想这个问题可能对你们有用


,,,

由于您还没有尝试任何东西,我建议您先尝试:)

以下是一些要点:

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

这里有一些有用的信息:

我不建议您的图像使用灰度。你似乎对红色和绿色背景感兴趣。这是一种简单而清晰的方法,可以在图像中区分红色值高于绿色值的任何像素

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
,如下所示:

如果需要,下一步是提取边的坐标。这可以通过以下方式实现:

contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
有关
cv2.canny
cv2.findContours
的文档可以分别找到和

更多:如果使用灰度,会发生什么情况: 生成的图像是:


灰度法显示了花的许多内部结构。这是好是坏取决于你的目标。

到目前为止,我还没有尝试过。
有机会再来看看你可以用ImageMagic试试——这似乎很容易,但它对每一张图像都有效,还是只对红色和绿色图像有效?@varsha_holla在计算机视觉中,没有真正通用的解决方案。在这种情况下,如果您正在绿色背景上寻找一朵红花,则红色和绿色很可能具有相同的灰度值,使灰度变得无用,但使用红色和绿色可以获得清晰的图像。另一方面,如果你在蓝天下寻找一棵绿树,那么绿色与蓝色的对比就更有意义了。如果你在阴天看一个平淡的城市景观,可能根本就没有有用的颜色。你必须逐案处理。@varsha_holla为了说明问题,我刚刚添加了使用灰度的结果:输出显示了花的大部分内部结构。如果你对内部结构感兴趣,那是件好事。如果你不是,那就不是。我觉得这个回答很有帮助,很有启发性。我只想补充一点,在我自己的简短经验中,
findContours
使用类似于
img2
(如上)的东西比使用
edges
效果更好。
img = cv2.imread('flower.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
gray1 = cv2.Canny(img, 70, 50)
cv2.imwrite('gray1.png', gray1)