参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。
# 图像的边缘:图像中灰度值发生急剧变化的位置,边缘检测目的:为了绘制出边缘线条;
# 图像边缘通常是不连续的,不能表示整体;
# 图像轮廓:将边缘连接起来形成的整体;
# 边缘检测:检测结果通常为黑白图像,图像中白色线条表示边缘;
# 常见边缘检测算法:Laplacian边缘检测、Sobel边缘检测、Canny边缘检测;
# 1.Laplacian边缘检测
# 拉普拉斯边缘检测:使用图像矩阵与拉普拉斯核进行卷积运算;
# 本质:计算图像中任意一点与其在水平方向和垂直方向上4个相邻点平均值的差值;
# 常用拉普拉斯核如下:
"""
第一种:
[[0 1 0],
[1 -4 1],
[0 1 0]]
第二种:
[[0 -1 0],
[-1 4 -1],
[0 -1 0]]
第三种:
[[0 2 0],
[2 -8 2],
[0 2 0]]
第四种:
[[0 -2 0],
[-2 8 -2],
[0 -2 0]]
"""
# 语法格式:dst = cv2.Laplacian(src, ddepth[, ksize[, scale[, delta[, borderType]]]])
# 参数说明:
# a.dst:边缘检测结果图像;
# b.src:原图像;
# c.ddepth:目标图像的深度;
# d.ksize:用于计算二阶导数滤波器的系数,必须为正数,且为奇数;
# e.scale:可选比例因子;
# f.delta:添加到边缘检测结果中的可选增量值;
# g.borderType:边界值类型;
import cv2 as cv
img1 = cv.imread("apollo_car.JPG")
img2 = cv.Laplacian(img1, cv.CV_8U)
cv.imshow("apollo", img1)
cv.imshow("apollo_laplacian", img2)
cv.waitKey(0)
# 2.Sobel边缘检测
# Sobel边缘检测:将高斯滤波和微分结合起来执行图像卷积运算,结果具有一定的抗噪性;
# 语法格式:dst = cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
# 参数说明:
# a.dst:边缘检测结果图像;
# b.src:原图像;
# c.ddepth:目标图像的深度;
# d.dx:导数x的阶数;
# e.dy:导数y的阶数;
# f.ksize:扩展的Sobel内核大小,必须是1,3,5,7;
# g.scale:计算导数的可选比例因子;
# h.delta:添加到边缘检测结果中的可选增量值;
# i.borderType:边界值类型;
import cv2 as cv
img1 = cv.imread("apollo_car.JPG")
img2 = cv.Sobel(img1, cv.CV_8U, 0, 1)
cv.imshow("apollo", img1)
cv.imshow("apollo_sobel", img2)
cv.waitKey(0)
# 3.Canny边缘检测
# Canny边缘检测步骤:
# a.使用高斯滤波去除图像噪声;
# b.使用Sobel核进行滤波,计算梯度;
# c.在边缘使用非最大值抑制;
# d.对检测出的边缘使用双阈值以去除假阳性;
# e.分析边缘之间的连接性,保留真正的边缘,消除不明显的边缘;
# 语法格式:dst = cv2.Canny(src, threshold1, threshold2[, apertureSize[, L2gradient]])
# 参数说明:
# a.dst:边缘检测结果图像;
# b.src:原图像;
# c.threshold1:第一阈值;
# d.threshold2:第二阈值;
# e.apertureSize:计算梯度时使用的Sobel核大小;
# f.L2gradient:标志;
import cv2 as cv
img1 = cv.imread("apollo_car.JPG")
img2 = cv.Canny(img1, 200, 300) # 通过调节阈值来观察结果变化
cv.imshow("apollo", img1)
cv.imshow("apollo_canny", img2)
cv.waitKey(0)
Laplacian边缘检测、Sobel边缘检测、Canny边缘检测对比
import cv2 as cv
img1 = cv.imread("pallet.JPG")
img2 = cv.Laplacian(img1, cv.CV_8U)
img3 = cv.Sobel(img1, cv.CV_8U, 1, 1)
img4 = cv.Canny(img1, 150, 200)
cv.imshow("pallet", img1)
cv.imshow("pallet_laplacian", img2)
cv.imshow("pallet_sobel", img3)
cv.imshow("pallet_canny", img4)
cv.waitKey(0)