网站首页 > 文章精选 正文
山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图。这些线条可以手动绘制,也可以由计算机生成。在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线。
findContours函数:
OpenCV为我们提供了“ findContours”功能,该功能可在二进制图像中查找轮廓并将其存储为坐标点的小数数组。功能定义如下。
cv.findContours(image,
mode,
method[,
contours[,
hierarchy[,
offset]]]) ->contours, hierarchy
image-源,一个8位单通道图像。非零像素被视为1。零像素保持为0,因此图像被视为二进制。
模式-轮廓检索模式。
方法-等高线近似方法。
轮廓检索模式:
第二个参数,即轮廓检索模式,用于检索图像中轮廓之间的关系。例如,在图
像中,轮廓内可能有轮廓,就像嵌套轮廓一样。在这种情况下,我们将外部轮廓称为父级,将内部轮廓称为子级。使用findContours函数时,应该检索轮廓之间的这些关系并将其存储在变量中。如果需要,将来也可以使用它们。OpenCV中有四种检索模式,分别是cv.RETR_LIST,cv.RETR_TREE,cv.RETR_CCOMP,cv.RETR_EXTERNAL。为了清楚了解检索模式,强烈建议参考OpenCV的轮廓轮廓官方教程。
轮廓近似法:
OpenCv中有两种轮廓逼近方法。它们是cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE。如果通过cv.CHAIN_APPROX_NONE,则将存储轮廓的所有边界点。但是实际上,我们是否需要所有这些要点?例如,找到了一条直线的轮廓,是否需要线上的所有点来表示该线?事实并非如此,我们只需要该行的两个端点即可。这就是cv.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。
drawContours函数:
找到轮廓并将轮廓线的坐标点(x,y)存储在数组中后,我们可以使用这些点在图像上绘制轮廓线。我们使用OpenCV的drawContours函数执行相同的操作。
cv.drawContours(image,
contours,
contourIdx,
color[,
thickness[,
lineType[,
hierarchy[,
maxLevel[,
offset]]]]]) ->image
图像-目标图像。
轮廓-所有输入轮廓。每个轮廓都存储为点向量。
outlineIdx-指示要绘制的轮廓的参数。如果为负,则绘制所有轮廓。
颜色-颜色的轮廓。
粗细-绘制等高线的粗细。如果为负(例如,thickness = FILLED),则绘制轮廓内部。
原始图像:
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, 1, 255, 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()
阈值图像和在其上绘制轮廓的原始图像如下:
- 上一篇: Opencv从零开始 - 「启蒙篇」- 轮廓和轮廓特征
- 下一篇: 图像分割之分水岭算法
猜你喜欢
- 2025-01-01 前端智能化实践:从图片识别UI样式
- 2025-01-01 OpenCV 和 Python 识别数字的结果是怎样的呢
- 2025-01-01 HALCON_极坐标变换
- 2025-01-01 python使用fitz和opencv库提取pdf中的表格
- 2025-01-01 Fluent 多孔介质仿真(Porous Media)
- 2025-01-01 基于密度(Density-based)的聚类——核密度估计(KDE)
- 2025-01-01 机器视觉halcon学习系列---XLD的介绍和使用
- 2025-01-01 平学(26):Matlab学习之三维曲面图与常见函数(2)
- 2025-01-01 [OpenCV实战]13 OpenCV中使用Mask R-CNN进行对象检测和实例分割
- 2025-01-01 OpenCV使用分水岭算法实现图像分割
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)