概述
边缘检测是计算机视觉和图像处理中最基本也是最重要的技术之一,它通过检测图像中亮度或颜色急剧变化的区域来识别物体的边界。边缘通常对应着场景中物体的物理边界、表面方向的变化或深度不连续处。
分类
OpenCV提供了多种边缘检测算法,下面我们介绍最常用的几种。
1. Sobel算子
Sobel算子是一种基于一阶导数的边缘检测算子,它通过计算图像在水平和垂直方向的梯度来检测边缘。
import cv2
zl=cv2.imread('csdn_test.png',0)
#zl=cv2.cvtColor(zl,cv2.COLOR_BGR2GRAY)
cv2.imshow('zl',zl)
cv2.waitKey(0)
zl_x_64=cv2.Sobel(zl,cv2.CV_64F,dx=1,dy=0)
zl_x_full=cv2.convertScaleAbs(zl_x_64) #转换为绝对值,负数转换为正数
zl_y_64=cv2.Sobel(zl,cv2.CV_64F,dx=0,dy=1)
zl_y_full=cv2.convertScaleAbs(zl_y_64) #转换为绝对值,负数转换为正数
zl_xy_Sobel_full=cv2.addWeighted(zl_x_full,1,zl_y_full,1,0)
cv2.imshow('zl_xy_Sobel_full',zl_xy_Sobel_full)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.Scharr 算子
import cv2
####Scharr 算子
# cv.Scharr(src, ddepth, dx, dyl, dst[, scale[, delta[, borderType]]]])
# src:输入图像
# ddepth:输出图片的数据深度,由输入图像的深度进行选择
# dx:x 轴方向导数的阶数
# dy:y 轴方向导数的阶数
zl=cv2.imread('csdn_test.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl',zl)
cv2.waitKey(0)
#zl=cv2.cvtColor(zl,cv2.COLOR_BGR2GRAY)
zl_x_64=cv2.Scharr(zl,cv2.CV_64F,dx=1,dy=0) #默认int8改为float64,可保存负数
zl_x_full=cv2.convertScaleAbs(zl_x_64) #转换为绝对值,负数转换为正数
zl_y_64=cv2.Scharr(zl,cv2.CV_64F,dx=0,dy=1) #默认int8改为float64,可保存负数
zl_y_full=cv2.convertScaleAbs(zl_y_64) #转换为绝对值,负数转换为正数
zl_xy_Scharr_full=cv2.addWeighted(zl_x_full,1,zl_y_full,1,0)
cv2.imshow('zl_xy_Scharr_full',zl_xy_Scharr_full)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. Canny边缘检测
Canny边缘检测是最流行、效果最好的边缘检测算法之一,它包含以下步骤:
1. 高斯滤波去噪
2. 计算梯度强度和方向
3. 非极大值抑制
4. 双阈值检测和连接边缘
import cv2
# canny边缘检测
# cv.Canny( image, threshold1, threshold2[, apertureSizel, L2gradient]])
# image 为输入图像。
# threshold1 表示处理过程中的第一个調值。fL
# threshold2 表示处理过程中的第二个值。fH
zl=cv2.imread('csdn_test.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl',zl)
cv2.waitKey(0)
zl_canny=cv2.Canny(zl,60,180)
cv2.imshow('zl_canny',zl_canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.Laplacian算子
import cv2
# cv2.Laplacian(src, ddepthl,dstl,ksizel, scalel, deltal, borderType]]]]])
# 参数说明:
# src:输入图像,可以是灰度图像,也可以是多通道的彩色图像
# ddepth:输出图片的数据深度:
# ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项
# scale:缩放比例因子,可选项,默认值为1
# delta:输出图像的偏移量,可选项,默认值为日
zl=cv2.imread('csdn_test.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl',zl)
cv2.waitKey(0)
zl_lap=cv2.Laplacian(zl,cv2.CV_64F) #默认int8改为float64,可保存负数
zl_lap_full=cv2.convertScaleAbs(zl_lap) #转换为绝对值,负数转换为正数
cv2.imshow('zl_lap_full',zl_lap_full)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
OpenCV提供了强大而灵活的边缘检测工具,从简单的Sobel算子到复杂的Canny检测器。理解这些算法的原理和参数对于实际应用至关重要。通过适当的预处理和参数调整,可以在各种应用场景中获得理想的边缘检测结果。