上一节为低通滤波,最主要的作用是去噪
高斯滤波去除高斯噪声
中值滤波去除椒盐噪声
双边噪声用于美颜
高通滤波最主要的作用是用于检测边缘
常见的高通滤波:
* Sobel(索贝尔)(高斯),对噪声适应性强,很多算法均以索贝尔卷积核为基础
* Scharr(沙尔), 卷积核不会改变,3*3大小,如果Sobel(索贝尔)的size设为-1,则自动使用的则为沙尔滤波,所以一般情况下均使用索贝尔算法
。
对于3*3的卷积核,Sobel(索贝尔)没有Scharr(沙尔)好,因为Scharr(沙尔)可以检测出更细的边缘线。Sobel(索贝尔)比较粗糙
缺点:计算边缘时,只能求一个方向,要么是横轴,要么是纵轴,最后再相加的出最终结果
* Laplacian(拉普拉斯),优点不需要单独求x或y的边缘,可以直接将横轴和纵轴的边缘全部检测出来。
缺点:对噪声比较敏感,在其内部没有降噪的功能,因此在使用前,需要进行降噪处理。
Sobel算子
* 先对X方向求导
* 再对Y方向求导
* 最终结果进行累加
* 注:不能两个方向同时求
Sobel API
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)
Scharr(沙尔)算子
与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)
边缘检测 Canny
边缘检测效果最好,主要有以下步骤
* 使用5*5高斯滤波消除噪声
* 计算图像梯度的方向(0°/45°/90°/135°)共四个方向
* 在四个方向上取局部最大值
* 取出最大值后进行阈值计算
AC是边缘,B不是边缘,小于阈值不认为是边缘,大于阈值认为是边缘
Canny API
重要的是前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)
具体的边缘跟设定的阈值有关