卷积:对于某一位置的像素,通过算法把他附近的所有的像素点的值联合起来,重新设置这个像素的大小。
图像模糊处理的其他的方法:均值,中值,就是取周围所有的像素的均值,中值来设置这个像素的大小。
(关于边界问题:补零,边界赋值,块赋值,镜像复制等方法)
一 调用函数实现模糊
代码
import cv2 as cv def mohu_image(src): #均值模糊 src2=cv.blur(src,(5,5)) cv.imshow('junzhimohu',src2) # 中值模糊 src2=cv.medianBlur(src,5) cv.imshow('mediamohu',src2) # 高斯模糊 src2 = cv.GaussianBlur(src, (5,5),2) cv.imshow('gaosimohu', src2) # 双边滤波 src2=cv.bilateralFilter(src,5,5,2) cv.imshow('shuangbian',src2) src=cv.imread('./girl.jpg') cv.imshow('before',src) mohu_image(src) cv.waitKey(0) cv.destroyAllWindows()
效果展示
1 均值模糊函数blur()
blur(src,ksize,dst=None, anchor=None, borderType=None)
函数有5个参数,但最后三个均为none,所以也就2个参数
- src:要处理的图像原图
- ksize:周围关联的像素的范围,代码中的(5,5),就是计算这些范围内的均值来确定中心位置的大小.
2.中值模糊函数medianBlur()
medianBlur(src, ksize, dst=None)
ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5的方阵
3.高斯平滑函数GaussianBlur()
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
- src:要处理的图像原图
- ksize:周围关联的像素的范围,代码中的(5,5),就是计算这些范围内的均值来确定中心位置的大小.
- sigmaX:标准差
4.双边滤波函数bilateralFilter()
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
- d:邻域直径
- sigmaColor:颜色标准差
- sigmaSpace:空间标准差
二 自定义模糊
代码
import cv2 as cv import numpy as np # 自定义模糊 def zi_image(src): #自定义模糊 kernel=np.ones((2,2),np.uint8) src2=cv.filter2D(src,-1,kernel) cv.imshow('define_mohu',src2) #自定义锐化 kernel2= np.array([[0,-1,0],[-1,5,-1],[0,-1,0]], np.float32) src2=cv.filter2D(src,-1,kernel2) cv.imshow('define_yuehua',src2) src=cv.imread('./girl.jpg') cv.imshow('before',src) zi_image(src) cv.waitKey(0) cv.destroyAllWindows()
cv.Filter2D对图像做卷积
cvFilter2D( const CvArr* src, #输入图像 CvArr* ddepth, #深度,输入值为-1时,目标图像和原图像深度保持一致 const CvMat* kernel, #卷积核 CvPoint anchor=cvPoint(-1,-1) ); #核的锚点
- kernel
卷积核,单通道浮点矩阵.如果想要应用不同的核于不同的通道,先用cv.split函数函数分解图像到单个色彩通道上,然后单独处理.
#修改kernel矩阵可以实现不同的模糊.
- anchor
核德锚点表示一个被滤波的点在核内的位置.锚点应该处于核内部.默认(-1,-1)表示锚点的中心.