19.高通滤波

上一节为低通滤波,最主要的作用是去噪

高斯滤波去除高斯噪声

中值滤波去除椒盐噪声

双边噪声用于美颜

高通滤波最主要的作用是用于检测边缘

常见的高通滤波:

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

 具体的边缘跟设定的阈值有关

猜你喜欢

转载自blog.csdn.net/qq_45355603/article/details/125261353