图像的模糊处理,滤波,卷积等操作等是图像处理与计算机视觉中的一个重要内容。
图像均值滤波:
函数:
cv.blur(src, ksize[, dst[, anchor[, borderType]]])
#9,图像滤波操作
import cv2 as cv
import numpy as np
def mean_Filter(image):
#均值滤波
#第一个参数:输入图像,第二个参数位卷积核形状
meanImage=cv.blur(image,(5,5))
cv.imshow("meanfilter_demo",meanImage)
src=cv.imread(r'F:\OutputResult\SrcImage\saber18.jpg')
cv.imshow("Saber",src)
mean_Filter(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果:
中值滤波:
中值滤波对椒盐噪声很有效,因此先对原图加入椒盐噪声来验证中止滤波的效果。在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声。Python版本的OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实现。
加入椒盐噪声函数:
import cv2
import numpy as np
#椒盐噪声
def PepperandSalt(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=np.random.random_integers(0,src.shape[0]-1)
randY=np.random.random_integers(0,src.shape[1]-1)
if np.random.random_integers(0,1)<=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
对椒盐噪声滤波:
高斯滤波:
函数:cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
参数ksize高斯核大小。ksize.width和ksize.height可以不同,但两者都必须正的和奇数的。或者,它们可以是零,然后根据sigma计算归一化后的权重。
参数sigmaX高斯核在X方向的标准偏差。参数sigmaY高斯核在Y方向的标准偏差。
如果sigmaY为零,则设置为等于sigmaX,如果两个sigma都是零,则从ksize.width和ksize.height计算,分别(详情请参见GetGaussiankernel);无论以后可能会修改所有这些语义,建议指定所有ksize,SigmaX和SigmaY。
(ksize与sigma数学推导计算还可参考:此处)
情况一:指定ksize.width和ksize.height,sigma的情况,效果如下:
import cv2 as cv
def gaussian_Filter(image):
#高斯滤波
#第一个参数为输入图像,第二个参数为卷积核大小,后面的为标准方差σ
gaussianImage=cv.GaussianBlur(image,(5,5),2)
cv.imshow("gaussian_demo",gaussianImage)
src=cv.imread(r'F:\OutputResult\SrcImage\saber18.jpg')
cv.imshow("src",src)
gaussian_Filter(src)
cv.waitKey(0)
cv.destroyAllWindows()
情况二:gaussianImage=cv.GaussianBlur(image,(0,0),2)ksize.width和ksize.height它们是零,然后根据sigma计算归一化后权重,效果如下:
情况三:gaussianImage=cv.GaussianBlur(image,(5,5),0)此时标准差sigma都是零,则从ksize.width和ksize.height计算归一化权重,效果如下:
图像自定义滤波:
函数:cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
import cv2 as cv
import numpy as np
def self_Filter(image):
#自定义一个锐化滤波器
kernel1=np.ones((3,3),np.float)
kernel2=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float)
#filter2D参数-1表示和原图像位深一致
dstImage1=cv.filter2D(image,-1,kernel1)
dstImage2=cv.filter2D(image,-1,kernel2)
cv.imshow("dstImage1",dstImage1)
cv.imshow("dstImage2",dstImage2)
src=cv.imread(r'F:\OutputResult\SrcImage\saber18.jpg')
cv.imshow("Saber",src)
self_Filter(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果:
EPF边缘保持滤波器:
高斯双边滤波:
函数说明:
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
src:源8位或浮点、1通道或3通道图像。dst与大小和类型相同的dst目标映像。
d:过滤过程中使用的每个像素邻域的参数d直径。如果不是阳性,它是根据sigmaspace计算的。
sigma color:颜色空间中的参数sigma color过滤器sigma。参数的较大值意味着 像素邻域(参见sigmaspace)中的更多颜色将混合在一起,从而在较大的半等色区域。
sigmaSpace:坐标空间中的参数sigma space过滤器sigma。参数的较大值意味着只要像素的颜色足够接近,像素越远,就会相互影响(参见sigmacolor)。
参数borderType边框模式用于在图像外部外推像素,请参见borderType。
import cv2 as cv
import numpy as np
#两个边缘保持滤波:
def bilater_Filter(image):
#1.高斯双边滤波
bilateralImage=cv.bilateralFilter(image,0,100,20)
cv.imshow("bilateral_demo",bilateralImage)
src=cv.imread(r'F:\OutputResult\SrcImage\face1.jpg')
cv.imshow("face",src)
meanShift_Filter(src)
cv.waitKey(0)
cv.destroyAllWindows()
可以看到下面水印和边缘被保留,其余部分被滤波。
均值漂移滤波:
cv.pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]])
函数说明:
参数1:src源8位3通道图像。
参数2:dst与源具有相同格式和大小的目标图像。
参数3:sp空间窗口半径。
参数4:sr颜色窗口半径。
可选参数:
参数maxlevel:用于分割的棱锥图的参数maxlevel最大级别。
参数termcrit终止条件:何时停止Meanshift迭代。
均值漂移除了可以用于滤波,还可以进行图像分割,即利用其滤波后的结果对其不同的区域进行漫水填充。
import cv2 as cv
import numpy as np
def meanShift_Filter(image):
#2.均值漂移滤波
sp=10
sr=50
maxlevel=1
meanshiftImage=cv.pyrMeanShiftFiltering(image,sp,sr,maxlevel)
cv.imshow("meanShift_demo",meanshiftImage)
src=cv.imread(r'F:\OutputResult\SrcImage\face1.jpg')
cv.imshow("face",src)
meanShift_Filter(src)
cv.waitKey(0)
cv.destroyAllWindows()
参考文献:
https://www.cnblogs.com/shine-lee/p/9671253.html
https://docs.opencv.org/4.1.0/d4/d86/group__imgproc__filter.html#gac05a120c1ae92a6060dd0db190a61afa