如何使用Python找到图像中物体的形状
我想知道怎么找到图片中物体的形状,并把它存储到一个变量里,以便后续使用。比如说,
我只想提取出形状,像这样(我在Photoshop里处理过这张图片),
我只需要图片的轮廓,并且想把它保存到硬盘上。我到现在还没尝试过,我使用的是Python 2.7。
欢迎任何建议。
提前谢谢大家!
3 个回答
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
看起来是这样的:
接下来的步骤,如果你想的话,可以提取边缘的坐标。这可以通过以下方式实现:
contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
关于cv2.canny
和cv2.findContours
的详细说明可以在这里和这里找到。
更多:如果你使用灰度图像会发生什么:
img = cv2.imread('flower.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
gray1 = cv2.Canny(img, 70, 50)
cv2.imwrite('gray1.png', gray1)
生成的图像是:
灰度处理显示了花的内部结构。这个好坏取决于你的目标是什么。