Python-OpenCV-边缘检测

在实际处理图像应用中,我们通常需要提取图像的边缘信息,便于我们进行观测、实验。

Laplacian边缘检测

拉普拉斯是用二阶差分计算边缘的,连续函数的情况下在一阶微分图中极大值或极小值处,认为是边缘。在二阶微分图中极大值和极小值之间的过点,被认为是边缘。

# 拉普拉斯边缘检测

# 深度设置为-1,与输入图像深度相同,均为np.uint8类型

img_laplacian = cv2.Laplacian(img_gray, cv2.CV_8U)

Canny边缘检测

Canny边缘检测的算法更复杂,它包含下列5个步骤:

(1)使用高斯滤波去除图像噪声。

(2)使用Sobel核进行滤波,计算梯度。

(3)在边缘使用非最大值抑制。

(4)对检测出的边缘使用双阈值以去除假阳性。

(5)分析边缘之间的连接性,保留真正的边缘,消除不明显的边缘

# Canny边缘检测

# 100位第一个阈值;200为第二个阈值

img_canny = cv2.Canny(img_gray, 100, 200)

Sobel边缘检测

Sobel边缘检测算法比较简单,虽然准确度较低,但在很多实际应用中,尤其是对效率要求较高,对纹理不太关心的时候,Sobel算法却是首选。

Sobel算子是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

Sobel算法,就是将得到像素点乘以一个3*3矩阵(Sobel算子)得到一个该点的灰度矢量值或者其法矢量值。Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。

# Sobel边缘检测
'''
深度设置为-1,与输入图像深度相同,均为np.uint8类型;
dx为导数x的阶数;
dy为导数y的阶数
'''
# 垂直方向sobel梯度
img_sobelx = cv2.Sobel(img_gray, cv2.CV_8U, dx=1, dy=0)
# 水平方向sobel梯度
img_sobely = cv2.Sobel(img_gray, cv2.CV_8U, dx=0, dy=1)
# Sobel边缘检测
'''
深度设置为-1,与输入图像深度相同,均为np.uint8类型;
dx为导数x的阶数;
dy为导数y的阶数
'''
# 垂直方向sobel梯度
img_sobelx = cv2.Sobel(img_bin, cv2.CV_8U, dx=1, dy=0,ksize=3)
sobelx=cv2.convertScaleAbs(img_sobelx)
# 水平方向sobel梯度
img_sobely = cv2.Sobel(img_bin, cv2.CV_8U, dx=0, dy=1,ksize=3)
sobely=cv2.convertScaleAbs(img_sobely)
# 求和
img_sobelxy = cv2.addWeighted(sobelx,2,sobely,2,0)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值