马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一.高斯滤波
由于图像边沿检测就是把像素值有差异的地方提取出来,以是噪声会有很大影响,因此必要对图像举行平滑处理惩罚,高斯滤波是流程中常用的方法。
二.盘算图像的梯度与方向
过程中通常使用sobel算子举行梯度盘算,在OpenCV中,默认使用 G=|G(x)+G(y)| 来盘算梯度值。
这个角度值实在是当前边沿的梯度方向,若梯度方向不是0°、45°、90°、135°这种特定角度,那么就要用到插值算法来盘算当前像素点在其方向上举行插值的结果,然后举行比力并判断是否保存该像素点。
- 为-22.5°~22.5°,或-157.5°~157.5°,则以为边沿为程度边沿;
- 为22.5°~67.5°,或-112.5°~-157.5°,则以为边沿为45°边沿;
- 为67.5°~112.5°,或-67.5°~-112.5°,则以为边沿为垂直边沿;
- 为112.5°~157.5°,或-22.5°~-67.5°,则以为边沿为135°边沿;
三.非极大值克制
经过第二步得到的边沿不经过处理惩罚是没办法使用的,由于高斯滤波去噪后边沿会含糊,得到的边沿像素点非常多,因此必要对其举行一些过滤利用,而非极大值克制就是一个很好的方法。即检查每个像素点的梯度方向上的相邻像素,并保存梯度值最大的像素,将其他像素克制为零。
四.双阈值筛选
经过非极大值克制之后,我们还必要设置阈值来举行筛选。
当某一像素位置的幅值高出最高阈值时,该像素必是边沿像素;当幅值低于最低阈值时,该像素必不是边沿像素;幅值处于最高像素与最低像素之间时,如果它能连接到一个高于阈值的边沿时,则被以为是边沿像素,否则就不会被以为是边沿。
五.实现边沿检测的流程函数
edges = cv2.Canny(image, threshold1, threshold2)
- threshold1:低阈值,用于决定大概的边沿点。
- threshold2:高阈值,用于决定强边沿点。
- 纵然读到的是彩色图也可以举行处理惩罚。- import cv2 as cv
- img = cv.imread('../images/lvbo2.png')
- gray1 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
- # 手动进行高斯滤波再调用canny边缘检测
- img2 = cv.GaussianBlur(img, (3, 3), 1)
- gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
- # 二值化处理方便观察
- ret, binary = cv.threshold(gray1, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
- ret, binary1 = cv.threshold(gray2, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
- # 利用内置高斯滤波器进行边缘检测
- edge = cv.Canny(binary, 30, 70)
- edge1 = cv.Canny(binary1, 30, 70)
- cv.imshow('edge', edge)
- cv.imshow('edge1', edge1)
- cv.waitKey(0)
- cv.destroyAllWindows()
复制代码 可以发现,提前手动举行去噪处理惩罚结果更好,固然canny函数内置了高斯滤波,但根据要求举行去噪预处理惩罚可以得到更好的结果。
|