实例下载:图形检测,检测图形轮廓,边缘检测,轮廓拟合

一、简介

图形检测是计算机视觉的一项重要功能,通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如:搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线,有没有圆形等,虽然图形检测涉及非常深奥的数学算法,但OpenCV已经将这些算法封装成了简单的方法,开发者只需要学会如何调用,调参数即可实现检测功能

二、图像检测

1、图像的轮廓
轮廓,是指图像中图形或物体的外边缘线条,简单的几何图形轮廓是由平滑的线构成的,容易识别,但不规则图形的轮廓可能有许多点构成,识别起来比较困难
OpenCV提供的findContours()方法可以通过计算图像梯度来判断图像的边缘,然后将边缘的点封装成数组返回。
contours,hierarchy=cv2.findContours(image,mode,method)
image:被检测的图像,必须是8位单通道二值化图像,如果原始图像是彩色图像,必须转为灰度图像,并进行二值化阈值处理。
mode:轮廓检索模式:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测所有轮廓,但不建立层次关系
cv2.RETR_CCOMP 检测所有轮廓,并建立两级层次关系
cv2.RETR_TREE 检测所有轮廓,并建立树状结构的层次关系
method:检测轮廓时使用的方法
cv2.CHAIN_APPROX_NOE 存储轮廓上的所有点
cv2.CHAIN_APPROX_SIMPLE 只保存水平,垂直或对角线轮廓的端点
cv2.CHAIN_APPROX_TC89_L1 Ten-Chinl近似算法中的一种
cv.CHAIN_APPROX_TC89_KCOS Ten-Chinl近似算法中的一种
contours:检测出所有轮廓,list类型,每一个元素都是某个轮廓的像素坐标数组
hierarchy:轮廓之间的层次关系
通过findContours()方法找到图像轮廓之后,为了方便开发人员观测,最好能把轮廓画出来,也是OpenCV提供了drawContours()方法专门用来绘制这些轮廓,drawContours()方法的语法如下:
image= cv2.drawContours(image,contours,contourIdx,color,thickness,lineTypee,hierarchy,maxLevel,offset)
image:被绘制轮廓的原始图像,可以是多通道图像
contours:findContours()方法得出的轮廓列表
contourIdx:绘制轮廓的索引,如果为-1 则绘制所有轮廓
color:绘制颜色,使用BGR格式
thickness:可选参数,画笔的粗细程度,如果该值为-1则会绘制实心轮廓
lineTypee:可选参数,绘制轮廓线型
hierarchy:可选参数,findContours()方法得出的层次关系
maxLevel:可选参数,绘制轮廓的层次深度,最深绘制第maxLevel层
offset:可选参数,偏移量,可以改变绘制结果的位置
image:同参数中的image,方法执行后原始图像中就包含绘制的轮廓了,可以不使用此返回值保存结果

图形检测,检测图形轮廓,边缘检测,轮廓拟合实例

2、轮廓拟合

拟合,是指将平面上的一系列点,用一条光滑的曲线连接起来,轮廓的拟合就是将凹凸不平的轮廓用平整的几何图形体现出来,包括矩形包围框,圆形包围框
1)矩形包围框
矩形包围框是指将图形轮廓的最小矩形边界,OpenCV提供的boundingRect()方法可以自动计算出轮廓最小矩形边界的边界坐标和宽高
retval = cv2.boundingRect(array)
array:轮廓数组
retval:元组类型,包含四个整数值,分别是最小矩形包围框左上角顶点的横坐标,左上角定点的纵坐标,矩形的宽和矩形的高,所以也可以写成
x,y,w,h=cv2.boundingRect(array)形式
2)圆形包围框
圆形包围框与矩形包围框同理,是图像轮廓的最小圆形边界,OpenCV提供的minEnclosingCircle()方法可以自动计算出轮廓最小圆形边界的圆心和半径
center,radius= cv2.minEnclosingCircle(points)
points:轮廓数组
center:元组类型,包含两个浮点值,是最小圆形包围框圆心的横坐标和纵坐标
radius:浮点类型,最小圆形包围框的半径

3、凸包
前面说的矩形包围框与圆形包围框,这两种包围框虽然已经逼近图形的边缘,但这种包围框为了保持几何形状,与其他图形的真实轮廓贴合度较差,如何能找出图形最外层的端点,将这些端点连接起来,就可以围出一个保卫图形的最小包围框,这种包围框叫凸包
凸包是最逼近轮廓的多边形,凸包的每一处都凸出来,也就是任意三个点所组成的内角均小于180度。
hull = cv2.convexHull(points,clockwise,returnPoints)
points:轮廓数组
clockwise:可选参数,布尔类型,当该值为True时,凸包中的点按顺时针排列,为False时按逆时针排列
returnPoints:可选参数,布尔类型,当该值为True时返回点坐标,为False时返回点索引,默认值为True
hull:凸包的点阵数组

4、Canny边缘检测
Canny边缘检测算法是一个多级边缘检测算法,该算法根据像素的梯度变化寻找图像边缘,最终可以绘制出十分精细的二值边缘图像
edges = cv2.Canny(image,threshold1,threshold2,apertureSize,L2gradient)
image:检测的原始图像
threshold1:计算过程中使用的第一个阈值,可以是最小阈值,也可以是最大阈值,通常用来设置最小阈值
threshold2:计算过程中使用的第二个阈值,通常用来设置最大阈值
apertureSize:可选参数,Sobel算子的孔径大小
L2gradient:可选参数,计算图像梯度的标识,默认值为False,值为True时会采用更精准的算法进行计算
edges:计算后得出的边缘图像,是一个二值灰度图像
在开发过程中可以通过调整最小阈值和最大阈值来控制边缘检测的精细程度,当两个阈值都较小时,会检测出较多的细节,当两个阈值较大时会忽略较多细节。

5、霍夫变换
霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断出图像中的特殊形状,例如直线和圆
1)直线检测
霍夫直线变换是通过霍夫坐标系的直线与迪卡尔坐标系的点之间映射关系来判断图像中的点是否构成直线,OpenCV将此算法封装成了两个方法,分别是cv2.HoughLines()方法和cv2.HoughLinesP()方法,前者用于检测无限延长的直线,后者用于检测线段

HoughLinesP()方法名称最后有一个大写的P,该方法只能检测二值灰度图像,也就是只有两种像素值的黑白图像,方法最后会把找出来的所有线段的两个端点的坐标保存成一个数组
lines = cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
image:检测的原始图像
rho:检测直线使用的半径步长,值为1时,表示检测所有可能得半径步长
theta:搜索直线的角度,值为π/180时,表示检测所有角度
threshold:阈值,该值越小,检测出的直线就越多
minLineLength:线段的最小长度,小于该长度的直线不会被记录到结果中
maxLineGap:线段之间的最小距离
lines:一个数组,元素为所有检测出的线段,每个线段也是一个数组,内容为线段两个端点的横纵坐标,格式为[[[x1,y1,x2,y2],[x1,y1,x2,y2]]]

2)圆环检测
霍夫圆环变换的原理与霍夫直线变换类似,OpenCV提供的HoughCircles()方法用于检测图像中的圆,该方法在检测过程中进行两轮筛选,第一轮筛选会找出可能是圆的圆心坐标,第二轮筛选会计算出这些圆心坐标可能得对应的半径长度,方法最后会将圆心坐标和半径长度封装成一个浮点型数组
circles=cv2.HoughCircles(image,method,dp,minDist,param1,param2,minRadius,maxRadius)
image:检测的原始图像
method:检测方法,OpenCV4.0.0及以前版本提供了cv2.HOUGH_GRADIENT作为唯一可用方法
dp:累加器分辨率与原始图像分辨率之比的倒数,值为1时,累加器与原始图像具有相同的分辨率,值为2时,累加器分辨率为原始图像的1/2,通常使用1作为参数。
minDist:圆心之间的最小距离
param1:可选参数,Canny边缘检测使用的最大阈值
param2:可选参数,检测圆环结果的投票数,第一轮筛选时投票数超过该值得圆才会进入第二轮筛选,值越大,检测出的圆越少,但越精准
minRadius:可选参数,圆的最小半径
maxRadius:可选参数,圆的最大半径
circles:一个数组,元素为所有检测出的圆,每个圆也是一个数组,内容为圆心的横纵坐标和半径长度,格式[[[x1,y1,r1],[x1,y1,r1]]]
注意:使用该方法前  需要先为原始图像进行降噪处理,否则会影响检测结果

实例:

import cv2
import numpy as npimg = cv2.imread("D:/openCVImage/csdn-python/coin.jpg")  # 读取原图
o = img.copy()  # 复制原图
o = cv2.medianBlur(o, 5)  # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)  # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=5, maxRadius=100)
circles = np.uint(np.around(circles))  # 将数组元素四舍五入成整数
for c in circles[0]:  # 遍历圆环结果x, y, r = c  # 圆心横坐标、纵坐标和圆半径cv2.circle(img, (x, y), r, (0, 0, 255), 3)  # 绘制圆环cv2.circle(img, (x, y), 2, (0, 0, 255), 3)  # 绘制圆心
cv2.imshow("img", img)  # 显示绘制结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

具体实例:图形检测,检测图形轮廓,边缘检测,轮廓拟合

欢迎进群讨论及分享

QQ群:856044792

注:实战、案例 请关注作者其它csdn文章

python-OpenCV图像图形检测(四)相关推荐

  1. OpenCV 图像轮廓检测

    本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...

  2. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...

  3. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

  4. python+opencv车道线检测(简易实现)

    python+opencv车道线检测(简易实现) 技术栈:python+opencv 实现思路: canny边缘检测获取图中的边缘信息: 霍夫变换寻找图中直线: 绘制梯形感兴趣区域获得车前范围: 得到 ...

  5. python opencv 图像膨胀

    python opencv 图像膨胀 代码: import cv2 import numpy as np # 图像膨胀 def dilate_img(img,a,iterations):kernel ...

  6. python opencv 图像旋转

    python opencv 图像旋转 原图 顺时针旋转 代码: import cv2 path = '2.jpg' img = cv2.imread(path,1) trans_img = cv2.t ...

  7. opencv 图像阴影检测

    opencv 图像阴影检测  GarfieldEr007 2017-01-09  原文 参数说明: IplImage *workImg-当前全局变量,表示正在显示的图片. downleft, upri ...

  8. 【Python+OpenCV 图像的缩放和裁剪】

    Python+OpenCV 图像的缩放和裁剪 代码部分 实现效果 代码部分 import cv2 import numpy as npimg = cv2.imread("Photos/1.b ...

  9. 基于Python+OpenCV车道线检测(直道和弯道)

    基于Python+OpenCV车道线检测(直道和弯道) 基于Python+OpenCV车道线检测(直道和弯道)

最新文章

  1. java 封装事务_Spring之路(36)–事务很重要吗?Spring为何要封装事务?Spring事务有陷阱吗?...
  2. 软件分享:将应用一键打包成dmg文件
  3. Lesson 5.分类模型决策边界与模型评估指标
  4. 成功解决基于VS2015(Visual Studio2015)编写C++程序调试时弹出窗口一闪而过的问题
  5. boost::log::filter用法的测试程序
  6. iframe父子页面间的关系
  7. LG将授权webOS给其他电视厂商使用
  8. pymssql 安装后只有 .disk-info_龙虎榜之防盗扣安装榜主—王兰香
  9. 弥散阴影html,三步制作出这种精美弥散阴影
  10. 无法访问srv解析_访问本地项目,php不被解析,出现文件下载
  11. 车辆控制知识总结(一):LQR算法
  12. Linux大批量文件rm命令无效
  13. qq互联android sdk,QQ互联API列表 - YangJunwei
  14. shell 搜索文件夹下所有文件
  15. 没有自制力的人有什么资格谈努力
  16. html5取消backspace后退功能,js屏蔽退格键(backspace或者叫后退键与F5)
  17. SRS系列一——实现RTMP直播
  18. 2017年软考程序员下午题第二题
  19. testtesttesttest
  20. 思科与华为BGP配置命令对比

热门文章

  1. .NET对JAVA进行AES加密(SHA1PRNG)及解密方法
  2. sql查询文章上一篇下一篇
  3. java基础学习-6
  4. 哈尔滨工业大学计算机系统大作业-hello的程序人生
  5. 长安CS75PLUS安装第三方软件-长安CS75PLUS车机破解-长安CS75PLUS车机升级
  6. 自定义View之模仿AppleWatch手表
  7. SpringMVC——重定向(不带参数重定向、带参数重定向、FlashAttribute、RedirectAttribute)
  8. Ubuntu 配置项目环境之yml
  9. Dreamweaver 8序列号(Windows系统)
  10. css-相对定位、绝对定位