图像滤波 # 计算公式 N = (W-F+2P)/S+1 N输出图像大小 W源图输入;F卷积核大小,P扩充尺寸 S步长大小 # 低通滤波与高通滤波 图像滤波分为高通滤波和低通滤波,高通滤波用于求图形的边缘,低通滤波用于图像去噪、 图像模糊化等。这里的频是指变化(相邻像素值的变化),高通滤波是指使变化大也就是图像的边缘) 的通过(低通滤波是指使变化小(也就是图像中图形)的通过。高通滤波部分涉及到Sobel、Scharr、Laplacian、canny 等方法; 低通滤波 部分涉及: 均值滤波,方框滤波、中值滤波、高斯滤波和双边滤波。 对比度调节是通过修改图像中特定区域的像素值,使图像的对比度发生变化, 本博文涉及的对比度调节方法有:数值加减运算、线性变化、非线性变化、直方图均衡化等手段。 低通滤波可以去除噪音和平滑图像 高通滤波可以帮助查找图像的边缘 # API: filter2D(src,ddepth,kernel,anchor,delta,borderType)重点为前三个参数 src:img ddepth:图像位深,一般设置为-1 kernel:卷积核(低通滤波与高通滤波) anchor:锚点(默认-1)可以不设置 borderType:边界类型,可以采用默认 --------------------------------------------------- 方盒滤波与均值滤波 # 方盒滤波,一般用不到 normalize = true,a = 1/W x H6 # 均值滤波 blur(src,ksize,anchor,borderType)后两项一般不设置 -------------------------------------------------- 高斯滤波(又称中型滤波) # 高斯滤波API: GaussianBlur(img,kernel,sigmaX,sigmaY,...) -------------------------------------------------- # 中值滤波:medianBlur(img,ksize) # 双边滤波,主要作用是进行美颜,会保留脸型的边缘 bilateralFilter(img,d,sigmaColor,sigmaSpace,...) d可理解为核的大小 ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- 常见的高通滤波 # Sobel(索贝尔)(高斯) 先向x方向求导 然后在y方向求导 最终结果:|G| = |Gx|+|Gy| Sobel API: Sobel(src,ddepth,dx,dy,ksize = 3) 示例: sobelx = cv.Sobel(img, cv.CV_64F,1,0,ksize=5) sobely = cv.Sobel(img, cv.CV_64F,0,1,ksize=5) # Scharr(沙尔) API介绍: 与Sobel类似,只不过使用的kernel值不同。 Scharr只能求x方向或y方向的边缘 Scharr(src,ddepth,dx,dy,scale,...) # Laplacian(拉普拉斯) API介绍: 可以同时求两边方向的边缘 缺点:对噪音敏感,一般需先进行去噪再调用拉普拉斯 Laplacian(img,ddepth,ksize=1)
低通滤波:
import cv2 as cv
import numpy as np
img = cv.imread('./img/houmo.png',cv.IMREAD_COLOR)
img = cv.resize(img,(480,640))
# 图像滤波
# kernel = np.ones((5,5),np.float32) / 25
# img_kernel = cv.filter2D(img,-1,kernel)
# 均值滤波
# dst = cv.blur(img,(5,5))
# 高斯滤波
# dst = cv.GaussianBlur(img,(5,5),1)
# 中值滤波
# dst = cv.medianBlur(img,5)
# 双边滤波,主要作用是进行美颜
dst = cv.bilateralFilter(img,7,20,50)
# 高通滤波
cv.imshow('dst',dst)
cv.imshow('img',img)
cv.waitKey(0)
高通滤波:
import cv2 as cv
import numpy as np
img = cv.imread('./img/houmo.png')
# 索贝尔算子
# sobelx = cv.Sobel(img, cv.CV_64F,1,0,ksize=5)
# sobely = cv.Sobel(img, cv.CV_64F,0,1,ksize=5)
#
# # dst = sobelx + sobely
# dst = cv.add(sobelx,sobely)
# ------------------------------------------------------
# 拉普拉斯
ldst = cv.Laplacian(img,cv.CV_64F,ksize=5)
# cv.imshow('Sobelx',sobelx)
# cv.imshow('Sobely',sobely)
# cv.imshow('dst',dst)
cv.imshow('ldst',ldst)
cv.waitKey(0)