OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
Posted showswoller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)相关的知识,希望对你有一定的参考价值。
需要源码和图片请点赞关注收藏后评论区留言私信~~~
一、Canny边缘检测
Canny边缘检测算法是一个多级边缘检测算法,该算法根据像素梯度变化寻找图像边缘,最终可以绘制十分精细的二值边缘图像
opencv将canny边缘检测算法封装在canny方法中 语法如下
edges=cv2.Canny(image,threshold1,threshold2,apertureSize,L2gradient)
image 检测的原始图像
threshold1 计算过程中使用的第一个阈值 通常用来设置最小阈值
threshold2 第二个阈值 通常用来设置最大阈值
apertureSize 可选参数 Sobel算子的孔径大小
edges 计算后得出的边缘图像 是一个二值灰度图像
下面使用Canny算法检测花朵边缘
不同最小和最大阈值显示的效果不一样
部分代码如下
import cv2
img = cv2.imread("flower.png") # 读取原图
r1 = cv2.Canny(img, 10, 50); # 使用不同的阈值进行边缘检测
r2 = cv2.Canny(img, 100, 200);
r3 = cv2.Canny(img, 400, 600);
cv2.imshow("img", img) # 显示原图
cv2.imshow("r1", r1) # 显示边缘检测结果
cv2.imshow("r2", r2)
cv2.imshow("r3", r3)
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
二、霍夫变换
霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断图像中的特殊形状
1:直线检测
霍夫直线变换是通过霍夫坐标系的直线与笛卡尔坐标系的点之间的映射关系来判断图像中的点是否构成直线。opencv将此封装成两个方法,分别是HoughLines和HoughLinesP,前者用来检测无限延长的线段,后者用于检测线段 下面介绍后者
该方法只能检测二值灰度图像,也就是只有两种像素值的黑白像素,该方法最后把找出的所有线段的两个端点坐标保存成一个数组 语法如下
lines=cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
rho 检测直线使用的半径步长 值为1表示检测所有可能的半径步长
theta 搜索直线的角度
threshole 阈值 该值越小 检测出的直线就越多
minLineLength 线段的最小长度 小于该长度的线段不记录到结果中
下面检测笔图像中出现的直线
部分代码如下
import cv2
import numpy as np
img = cvimread("pen.jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.mianBlur(o, 5) # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
binary = c.Canny(o, 50, 150) # 绘制边缘图像
# 检线,精度为1,全角度,阈值为15,线段最短100,最小间隔为18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines: # 遍历所有直线
x1, , x2, y2 = line[0] # 读取直线两个端点的坐标
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) # 在原始图像上绘制直线
cv2.imshow("canny", binary) # 显示二值化边缘图案
cv2.imsw("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
2:圆环检测
霍夫变换的原理与霍夫直线类似,opencv提供的HoughCircles方法用于检测图像中的圆环,该方法 在检测过程中进行两轮筛选,第一轮筛选找出可能是圆的圆心坐标,第二轮筛选计算这些圆心坐标可能对应的半径长度,该方法最后将圆心坐标和半径封装成一个浮点型数组
下面检测硬币图像中出现的圆环
可见检测结果十分精确
部分代码如下
import cv2
import numpy as np
img = cv2.imread("coin.jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.medianBlur(o, 5) # 使用中值滤波进行降噪
gr = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, madius=10, maxRadius=50)
circles = np.uint(np.around(circles)) # 将数组元素四舍五入成整数
for c in circles[0]: # 遍历圆环结果
x, y, r = c # 圆心横坐标、纵坐标和圆半径
cv2.rcle(img, (x, y), r, (0, 0, 255), 3) # 绘制圆环
cv2.circle(img, (x, y), 2, (0, 0, 255), 3) # 绘制圆心
cv2.imshimg", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
三、总结
图像轮廓指的是将图像的边缘连接起来形成的一个整体,它是图像的一个重要的特征信息,通过对图像的轮廓进行操作,能够得到这幅图像的大小、位置和方向等信息,用于后续的计算。为此,OpenCV提供了findContours()方法,通过计算图像的梯度,判断图像的轮廓。为了绘制图像的轮廓,OpenCV又提供了drawContours()方法。但需要注意的是,Canny()方法虽然能够检测出图像的边缘,但这个边缘是不连续的
创作不易 觉得有帮助请点赞关注收藏~~~
以上是关于OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)的主要内容,如果未能解决你的问题,请参考以下文章
HoughLines(opencv)之前的Canny有啥用?
基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存