高通滤波最主要的作用是检测边缘
Sobel(索贝尔)(高斯):
对噪音适用性很强,在内部首先使用了高斯滤波对噪音进行过滤,之后再通过一阶导求得图像边缘。【若卷积核size设置为-1,则自动使用的是沙尔滤波算法】
Scharr(沙尔) :
卷积核不可改变的一个3x3大小卷积核,可以检测出比较细小的边缘线(不常用,索贝尔可以代替沙尔)
【 索贝尔和沙尔的缺陷是只能检测一个方向的边缘,要么横轴,要么纵轴,所以调用 完后还需要自己把横轴和纵轴检测到的边缘线加起来才是最终结果】
Laplacian(拉普拉斯):
可以把横轴和纵轴的边缘全部检测出来,但是对噪音比较敏感,在内部没有进行降噪操作,使用之前需要自己手工降噪
索贝尔api
Sobel(src, ddepth, dx, dy, ksize = 3,
scale = 1, detal = 0, boderType = BORDER_DEFAULT)
src : 原图片
ddepth :输出图片位深
dx = 1,则检测出y方向边缘
dy = 1,则检测出x方向边缘
ksize :卷积核大小,若=-1,则为沙尔算法
以下代码就是用索贝尔算法例子
import cv2
import numpy as np
img = cv2.imread('d:\\STUDY_OPENCV\\img\\sz.png')
#索贝尔算子y方向边缘
d1 = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)#dx为1代表求得是y方向的边缘
#索贝尔算子x方向边缘
d2 = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
#dst = d1+d2 ,与下行代码功能一样
dst = cv2.add(d1,d2)
cv2.imshow('dst', dst)
cv2.imshow('d1',d1)
cv2.imshow('d2',d2)
cv2.imshow('img',img)
cv2.waitKey(0)
沙尔api
Scharr(src, ddepth, dx, dy,
scale = 1, detal = 0, boderType = BORDER_DEFAULT)
拉普拉斯api
Laplacian (src, ddepth, ksize = 1, scale = 1, boderType = BORDER_DEFAULT)
边缘检测小能手:canny
Canny(img, minVal, maxVal,…)
img :需要处理的图片
minVal :自己设定的最小阈值
maxVal :设定的最大阈值
【最小阈值和最大阈值中间范围过大时检测到的边缘比较少】
import cv2
import numpy as np
img = cv2.imread('d:\\STUDY_OPENCV\\img\\cdog.jpg')
dst = cv2.Canny(img, 120, 150)
cv2.imshow('img',img)
cv2.imshow('dst', dst)
cv2.waitKey(0)