opencv从入门到精通 哦吼09

目录

图形检测

图像的轮廓

轮廓拟合

矩形包围框

凸包

Canny 边缘检测

霍夫变换

直线检测

圆环检测

小结


图形检测

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

图像的轮廓

轮廓是指图像中图形或物体的外边缘线条。简单的几何图形轮廓是由平滑的线构成的,容易识别,但不规则图形的轮廓可能由许多个点构成,识别起来比较困难。

OpenCV 提供的 findContours()方法可以通过计算图像梯度来判断图像的边缘,然后将边缘的点封装成数组返回。findContours()方法的语法如下:

 contours, hierarchy = cv2.findContours(image, mode, methode)

 

 

 

通过 findContours()方法找到图像轮廓后,为了方便开发人员观测,最好能把轮廓画出来,于是 OpenCV 提供了 drawContours()方法用来绘制这些轮廓。drawContours()方法的语法如下:

import cv2
import numpy as np

img=cv2.imread('match/img_7.png',0)
cv2.imshow('img',img)
con,c=cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img,con,-1,(0,255,0),15)
cv2.imshow('img2',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import numpy as np

img=cv2.imread('dog/gou .jpg')
cv2.imshow('img',img)
img=cv2.medianBlur(img,5)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
t,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv2.imshow('binary',binary)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img,contours,-1,(0,0,255),2)
cv2.imshow('con',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓拟合

拟合是指将平面上的一系列点,用一条光滑的曲线连接起来。轮廓的拟合就是将凹凸不平的轮廓用平整的几何图形体现出来。本节将介绍如何按照轮廓绘制矩形包围框和圆形包围框。

矩形包围框

矩形包围框是指图像轮廓的最小矩形边界。OpenCV 提供的 boundingRect()方法可以自动计算轮廓最小矩形边界的坐标、宽和高。boundingRect()方法的语法如下:

retval = cv2.boundingRect (array)

import cv2
import numpy as np
img=cv2.imread('dog/img_1.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
t,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierachy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h=cv2.boundingRect(contours[0])
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),6)
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()

圆形包围框

圆形包围框与矩形包围框一样,是图像轮廓的最小圆形边界。OpenCV 提供的 minEnclosingCircle ()方法可以自动计算轮廓最小圆形边界的圆心和半径。minEnclosingCircle()方法的语法如下:

center, radius = cv2.minEnclosingCircle(points)

凸包

前介绍了矩形包围框和圆形包围框,这 2 种包围框虽然已经逼近了图形的边缘,但这种包围框为了保持几何形状,与图形的真实轮廓贴合度较差。如果能找出图形最外层的端点,将这些端点连接起来,就可以围出一个包围图形的最小包围框,这种包围框叫凸包。

 OpenCV 提供的 convexHull()方法可以自动找出轮廓的凸包,该方法的语法如下:

 hull = cv2.convexHull(points, clockwise, returnPoints)

Canny 边缘检测

Canny 边缘检测算法是 John F. Canny 于 1986 年开发的一个多级边缘检测算法,该算法根据像素的梯度变化寻找图像边缘,最终可以绘制十分精细的二值边缘图像。

OpenCV 将 Canny 边缘检测算法封装在 Canny()方法中,该方法的语法如下:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

霍夫变换

霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断图像中的特殊形状,例如直线和圆。本节将介绍如何检测图像中的直线和圆。

直线检测

霍夫直线变换是通过霍夫坐标系的直线与笛卡儿坐标系的点之间的映射关系来判断图像中的点是否构成直线。OpenCV 将此算法封装成两个方法,分别是 cv2.HoughLines()和 cv2.HoughLinesP(),前者用于检测无限延长的直线,后者用于检测线段。本节仅介绍比较常用的 HoughLinesP()方法。

HoughLinesP()方法名称最后有一个大写的 P,该方法只能检测二值灰度图像,也就是只有两种像素值的黑白图像。该方法最后把找出的所有线段的两个端点坐标保存成一个数组。

lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

import cv2
import numpy as np
image=cv2.imread('dog/gou .jpg')
o=image.copy()
dst=cv2.medianBlur(o,3)
dst=cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)
binary=cv2.Canny(o,50,150)
lines=cv2.HoughLinesP(binary,1,np.pi/180,15,minLineLength=100,maxLineGap=18)
for line in lines:
    x1,y1,x2,y2=line[0]
    cv2.line(image,(x1,y1),(x2,y2),(0,0,255),6)
cv2.imshow('image',image)
cv2.waitKey()
cv2.destroyAllWindows()

圆环检测

霍夫圆环变换的原理与霍夫直线变换类似。OpenCV 提供的 HoughCircles()方法用于检测图像中的圆环,该方法在检测过程中进行两轮筛选:第一轮筛选找出可能是圆的圆心坐标,第二轮筛选计算这些圆心坐标可能对应的半径长度。该方法最后将圆心坐标和半径封装成一个浮点型数组。

HoughCircles()方法的语法如下:

  circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)

注意

使用该方法前应该为原始图像进行降噪处理,否则会影响检测结果

小结

图像轮廓指的是将图像的边缘连接起来形成的一个整体,它是图像的一个重要的特征信息,通过对图像的轮廓进行操作,能够得到这幅图像的大小、位置和方向等信息,用于后续的计算。为此,OpenCV 提供了 findContours()方法,通过计算图像的梯度,判断图像的轮廓。为了绘制图像的轮廓,OpenCV 又提供了 drawContours()方法。但需要注意的是,Canny()方法虽然能够检测出图像的边缘,但这个边缘是不连续的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值