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

3 投票
3 回答
7987 浏览
提问于 2025-04-18 04:02

我想知道怎么找到图片中物体的形状,并把它存储到一个变量里,以便后续使用。比如说,

在这里输入图片描述

我只想提取出形状,像这样(我在Photoshop里处理过这张图片),

在这里输入图片描述

我只需要图片的轮廓,并且想把它保存到硬盘上。我到现在还没尝试过,我使用的是Python 2.7。

欢迎任何建议。

提前谢谢大家!

3 个回答

0

这里有很多教程和问题,可能对你有帮助,我觉得你可以看看。

你可以访问这些链接获取更多信息:链接1链接2链接3链接4链接5

2

既然你还没尝试过什么,我建议你先动手试试 :)

这里有一些建议:

  • 把图片转换成灰度图
  • 把灰度图放在一个numpy数组里
  • 制作一个直方图来统计图片中的亮度级别
  • 应用一个阈值,去掉背景
  • 你可以试试自适应阈值(可以在网上查查)
  • 使用边缘检测算法(比如Canny算法)
  • 用形态学运算,比如腐蚀和膨胀,来获得更好的效果

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

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)

生成的图像是:

enter image description here

灰度处理显示了花的内部结构。这个好坏取决于你的目标是什么。

撰写回答