上一节为低通滤波,最主要的作用是去噪
高斯滤波去除高斯噪声
中值滤波去除椒盐噪声
双边噪声用于美颜
高通滤波最主要的作用是用于检测边缘
常见的高通滤波:
对于3*3的卷积核,Sobel(索贝尔)没有Scharr(沙尔)好,因为Scharr(沙尔)可以检测出更细的边缘线。Sobel(索贝尔)比较粗糙
缺点:计算边缘时,只能求一个方向,要么是横轴,要么是纵轴,最后再相加的出最终结果
缺点:对噪声比较敏感,在其内部没有降噪的功能,因此在使用前,需要进行降噪处理。
Sobel(src, ddepth, dx, dy, ksize = 3,scale = 1,delte = 0,borderType = BORDER_DEFAULT)
ddepth 输出的位深,64位或32位
卷积核大小默认为3,可以改为5,7,若为-1则变为为沙尔算法
import cv2
import numpy as np
img = cv2.imread('E:\\112.png')
#索贝尔算子Y方向边缘
dst1 = cv2.Sobel(img,cv2.CV_64F,1,0)
#索贝尔算子X方向边缘
dst2 = cv2.Sobel(img,cv2.CV_64F,0,1)
#两个方向进行合并
dst3 = dst1 + dst2
#dst3 = cv2.add(d1,d2) 这种方法效率更高
cv2.imshow('img',img)
cv2.imshow('dst1',dst1)
cv2.imshow('dst2',dst2)
cv2.imshow('dst3',dst3)
cv2.waitKey(0)
与Sobel类似,只不过使用的kernel值不同,只支持3*3的卷积核
Scharr(沙尔)只能求x方向或y方向的边缘,重点还是索贝尔算子
简单修改即为沙尔算子,沙尔可以检测出更小的边缘
对应API
Laplacian(img, ddepth, ksize =1, scale = 1,borderType = BORDER_DEFAULT)
#拉普拉斯算子
dst4 = cv2.Laplacian(img, cv2.CV_64F,ksize=5)
cv2.imshow('dst4',dst4)
cv2.waitKey(0)
边缘检测效果最好,主要有以下步骤
AC是边缘,B不是边缘,小于阈值不认为是边缘,大于阈值认为是边缘
重要的是前3个参数
Canny(img, minVAL, maxVal,....)
import cv2
import numpy as np
img = cv2.imread('E:\\112.png')
dst = cv2.Canny(img,100,200)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
具体的边缘跟设定的阈值有关