推文:https://blog.csdn.net/zhuyong006/article/details/85682980
#模糊操作基本原理
#卷积原理
import cv2 as cv
import numpy as np
def blurDemo(image):#均值模糊,可以去噪声
dst=cv.blur(image,(5,5))#括号中中的数值参数分别代表x、y方向上的模数值
'''
定义:blur(src,ksize,dst=None, anchor=None, borderType=None)
定义是有5个参数,但最后三个均为none,所以也就2个参数
src:要处理的原图像
ksize: 必须是奇数卷积核,周围关联的像素的范围:代码中(5,5)就是5*5的大小,就是计算这些范围内的均值来确定中心位置的大小
'''
cv.imshow("blur",dst)
def medianBlurDemo(image):#中值模糊,适用去椒盐噪声(图片中有类似于椒盐的杂志)
dst=cv.medianBlur(image,5)
cv.imshow("blur",dst)
'''
定义:medianBlur(src, ksize, dst=None)
ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5的方阵
可以看到中值滤波对于这些白点噪声的去除是非常的好的。
'''
def customBlurDeom(image):#自定义模糊
'''
filter2D(src,ddepth,kernel):
ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵
'''
#kennel=np.ones([5,5],np.float32)/25
kennel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)#锐化操作,照片更加立体清晰
dst=cv.filter2D(image,-1,kennel)
cv.imshow("customedBlur",dst)
def clamp(pv):
if pv>255:
return 255
elif pv<0:
return 0
else:
return pv
def gaussianNoise(image):#高斯噪声
h,w,c=image.shape
for row in range(h):
for col in range(w):
s=np.random.normal(0,20,3)
b=image[row,col,0]#blue
g=image[row,col,1]#green
r=image[row,col,2]#red
image[row,col,0]=clamp(b+s[0])
image[row, col, 1] = clamp(b + s[1])
image[row, col, 2] = clamp(b + s[2])
cv.imshow("gaussianNoise",image)
src1=cv.imread("E:\OpenCVTests\IMG_4482.JPG")
cv.namedWindow("src1",cv.WINDOW_AUTOSIZE)
cv.imshow("src1",src1)
src2=cv.imread("E:\OpenCVTests/u=2386921870,1321148064&fm=26&gp=0.jpg")
cv.namedWindow("src2",cv.WINDOW_AUTOSIZE)
cv.imshow("src2",src2)
#函数调用区
#blurDemo(src1)
#medianBlurDemo(src2)
#customBlurDeom(src1)
dst=cv.GaussianBlur(src1,(0,0),15)#高斯模糊API,高斯模糊对高斯噪声有抑制作用
#对其中的两个参数设置,只需设置其中一个就好,分别为x、y和sigma
#原理:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
cv.imshow("GuassBlur",dst)
'''#耗时较长,通过函数计算出时间
t1=cv.getTickCount()
gaussianNoise(src1)
t2=cv.getTickCount()
time=(t2-t1)/cv.getTickFrequency()#毫秒
print("Time is:",time)
'''
cv.waitKey(0)
cv.destroyAllWindows()
#边缘保留滤波(EPF)
#基于高斯模糊的原理,EPF在处理图像的边缘(即图像色彩差异大的地方)进行保留
import cv2 as cv
import numpy as np
def biDemo(image):#bilateralFilter()祛斑、磨皮等美颜效果极强
dst=cv.bilateralFilter(image,0,150,5)
'''高斯双边模糊:
d:即 distance,常规为 0 ,像素的邻域直径,可有sigmaColor和sigmaSpace计算可得;
sigmaColor:尽量取大,目的将小的差异模糊掉,噪声去掉
sigmaSpace:尽量取小,那么“和”就小一点,主要的差异就保留下来
'''
cv.imshow("biDemo",dst)
def shiftDemo(image):#类似于油画效果
dst=cv.pyrMeanShiftFiltering(image,10,50)
'''
均值迁移模糊:
sp:(The spatial window radius) 定义的漂移物理空间半径大小
sr:(The color window radius) 定义的漂移色彩空间半径大小;
'''
cv.imshow("shiftDemo",dst)
src=cv.imread("E:\OpenCVTests/u=4129059048,1441148676&fm=26&gp=0.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
#biDemo(src)
shiftDemo(src)
cv.waitKey(0)
cv.destroyAllWindows()