边缘检测、边缘探测、轮廓绘制、多边形、区域分割、edge_detection、object_segmentation,使用opencv-python的函数cv2.findContours(),框出物体的轮廓
(关键词↑)
图片处理效果预览↑(就是封面图片),从左到右依次是:原图
阈值图(第一行)、Canny边缘提取(第二行)
蓝色矩形、绿色最小矩形、红色最小圆形
蓝色等高线轮廓、绿色贴合轮廓、红色包围轮廓
核心代码预览:
thresh, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
approx = cv2.approxPolyDP(cnt, epsilon, True)
hull = cv2.convexHull(cnt)
x, y, w, h = cv2.boundingRect(cnt)
min_rect = cv2.minAreaRect(cnt)
(x, y), radius = cv2.minEnclosingCircle(cnt)2018-06-30 初版 Yonv1943
2018-07-02 删除图片水印,其他小改动
2018-08-15 修复GitHub链接,感谢 知乎用户Yozora 在评论中指出错误
2018-11-24 回复评论内容,增加对多边形的筛选
我不满足于用一个矩形将图片中的目标框出,所以我寻找可以将目标的轮廓框出来的算法,最终我在opencv库里面找到了这个函数cv2.findContours(),参考另外一篇非常好的资料后(那篇非常好的资料→)OpenCV for detecting Edges, lines and shapes,我写出来本篇文章。
想要在自己电脑上运行的话,直接去上面这里↑复制、保存为*.py文件,并准备一张背景简单的测试图片,比如说这一张:test.png
下面是 TUTR_edge_detection.py 的流程图↓edge_detection.py 使用ProcessOn 绘制流程图
edge_detection.py
读取图片,并处理为二值图
cv2.imread('test.png') # a black objects on white image is better
# gray = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY)
# ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
thresh = cv2.Canny(image, 128, 256)
得到二值图后,使用cv2.findContours() 得到等高线 contours,关于它的三个参数,一般不需要改动:第一个是传入的二值图,不等于0的像素将参与等高线的计算
第二个决定hierarchy 采取什么样的格式输出,具体格式看→Contours Hierarchy
thresh, contours, hierarchy = cv2.findContours(thresh, cv2.R