0
点赞
收藏
分享

微信扫一扫

计算机视觉基础12---边缘检测

是她丫 2022-04-24 阅读 79

参考书目:《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)

1

# 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)

2

# 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)

3

Laplacian边缘检测、Sobel边缘检测、Canny边缘检测对比

4

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)

5

举报

相关推荐

0 条评论