社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

使用Python+OpenCV实现图像上轮廓绘制

小白学视觉 • 2 年前 • 434 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

在地形图中,你有没有注意到在山区和地形图中海拔高的区域周围画的线?这些线被称为地形等高线。它们给出了地形的高程剖面图。这些线条要么是手工绘制的,要么是电脑生成的。
在本文中,我们将看到如何使用OpenCV在一个简单的图像上绘制等高线。

findContours函数

OpenCV为我们提供了“findContours”函数,该函数在二值图像中查找轮廓,并将其存储为一个numpy坐标点数组。函数定义如下。
cv.findContours(image,
                mode,
                method[,
                contours[, 
                hierarchy[,
                offset]]]) ->contours, hierarchy
image-源,一个8位单通道图像。非零像素被视为1。零像素仍然是0,所以图像被视为二进制。
mode-轮廓检索模式。
method-等值线近似法。
以及其他三个可选参数。

轮廓检索模式

第二个参数,即轮廓检索方式,用于检索图像中轮廓之间的关系。例如,在图像中,可能会有轮廓内的轮廓,就像嵌套轮廓一样。在这种情况下,我们称外部轮廓为父线,称内部轮廓为子线。
在使用findContours函数时,应该检索轮廓之间的这些关系,并将其存储在一个变量中。如果需要的话,它们也可以在未来使用。
OpenCV中有四种检索模式,分别是cv.RETR_LIST,cv.RETR_TREE,cv.RETR_CCOMP,cv.RETR_EXTERNAL。为了清楚地了解检索模式,强烈建议参考OpenCV的轮廓官方教程:https://docs.opencv.org/master/d9/d8b/tutorial_py_contours_hierarchy.html

轮廓近似方法

OpenCv中有两种轮廓逼近方法。它们是cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE。如果通过cv.CHAIN_APPROX_NONE,则将存储轮廓的所有边界点。但实际上,我们需要所有的点吗?
例如,你发现了一条直线的轮廓线。需要这条直线上的所有点来表示这条直线吗?不,我们只需要这条线的两个端点。这就是cv.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。

drawContours函数

找到等高线后,将等高线的坐标点(x, y)存储在一个数组中,就可以用这些点在图像上绘制等高线。我们使用OpenCV的drawcontour函数来做同样的事情。
cv.drawContours(image,
                contours, 
                contourIdx,
                color[,
                thickness[,
                lineType[, 
                hierarchy[,
                maxLevel[,
                offset]]]]]) ->image
image- 目标图像。
contours-所有输入的轮廓线。每个轮廓被存储为一个点向量。
contourIdx-表示要绘制的轮廓的参数。如果是负数,则画出所有的等高线。
color-轮廓的颜色。
thickness-绘制轮廓时所用的线的粗细。如果为负值(例如,thickness=FILLED),则绘制轮廓内部。
现在,我们已经学习了函数findContours和drawContours,让我们运行一个简单的代码以将这些函数应用于图像:
这是原始图像:

import cv2 as cv
#read the image
img = cv.imread("D://medium_blogs//pattern1.jpg")
#convert the image to grayscale
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#blur image to reduce the noise in the image while thresholding
blur = cv.blur(gray, (10,10))
#Apply thresholding to the image
ret, thresh = cv.threshold(blur, 1255, cv.THRESH_OTSU)
#find the contours in the image
contours, heirarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
#draw the obtained contour lines(or the set of coordinates forming a line) on the original image
cv.drawContours(img, contours, -1, (0,255,0), 20)
#show the image
cv.namedWindow('Contours',cv.WINDOW_NORMAL)
cv.namedWindow('Thresh',cv.WINDOW_NORMAL)
cv.imshow('Contours', img)
cv.imshow('Thresh', thresh)
if cv.waitKey(0):
    cv.destroyAllWindows()
阈值图像和画上轮廓的原始图像如下。
阈值图像:
原始图像上绘制的等高线:
这就是如何在图像上找到并绘制等高线的方法。你也可以在地图上试试看。

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




    




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153002
 
434 次点击