一、模糊操作基本原理
1,基于离散卷积
2,定义好每一个卷积核
3,不同卷积核得到不同的卷积效果
4,模糊是卷积的一种表象
二、1*3卷积核举例
每次右移一格,进行对应相乘再求和。1*3的卷积核左右两边的元素并没有处理而是照搬下来。卷积核一般都奇数。
三、均值模糊
对随机噪声有很好的去噪效果
1,基于平均值的均值模糊
cv2.blur(image,(5,5))
需要传入目标图像,定义卷积核大小
import cv2
import numpy as npdef blur(image):dst = cv2.blur(image,(5,5))cv2.imshow("blur",dst)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
blur(src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
2,基于权重的高斯模糊
①概念公式
Ⅰ一维高斯正态分布
Ⅱ二维高斯公式
Ⅲ实际上图像是个二维的,若采用二维卷积核去计算的话很耗时,一般采用两个一维卷积核去操作运算
例如二维卷积核
可由和
两个一维卷积核来等效替代
②高斯噪声
实际上就是多个随机点分别对应加上原图像上
import cv2
import numpy as npdef clamp(pv):if pv>255: return 255if pv<0: return 0else : return pvdef gaussian_noise(image):h,w,c = image.shapefor row in range(h):for col in range(w):s = np.random.normal(0,20,3)b = image[row,col,0]g = image[row,col,1]r = image[row,col,2]image[row,col,0]=clamp(b+s[0])image[row,col,1]=clamp(g+s[1])image[row,col,2]=clamp(r+s[2])cv2.imshow("noise",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
t1 = cv2.getTickCount()
gaussian_noise(src)
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# mscv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
③高斯模糊
cv2.GaussianBlur(src,(0,0),15)
15表示公式中的σ的值
import cv2
import numpy as npsrc = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
dst = cv2.GaussianBlur(src,(0,0),15)
cv2.imshow("GaussianBlur",dst)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
④使用高斯模糊消除高斯噪声
import cv2
import numpy as npdef clamp(pv):if pv>255: return 255if pv<0: return 0else : return pvdef gaussian_noise(image):h,w,c = image.shapefor row in range(h):for col in range(w):s = np.random.normal(0,20,3)b = image[row,col,0]g = image[row,col,1]r = image[row,col,2]image[row,col,0]=clamp(b+s[0])image[row,col,1]=clamp(g+s[1])image[row,col,2]=clamp(r+s[2])cv2.imshow("noise",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)t1 = cv2.getTickCount()
gaussian_noise(src)#给图像加入高斯噪声
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# ms#dst = cv2.GaussianBlur(src,(0,0),15)
dst = cv2.GaussianBlur(src,(5,5),0)#对加入高斯噪声的图像进行高斯模糊操作
cv2.imshow("GaussianBlur",dst)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
二、中值模糊
中值模糊一般用于消除椒盐噪声
cv2.medianBlur(image,5)
需要传入目标图像,卷积核大小
import cv2
import numpy as npdef median_blur(image):dst = cv2.medianBlur(image,5)cv2.imshow("median_blur",dst)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\l.png")
cv2.imshow("image",src)
median_blur(src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
三、自定义模糊
cv2.filter2D(image,-1,kernel=kernel1)
需要传入目标图像,自定义卷积核
import cv2
import numpy as np'''
之所以有的需要除以25和除以9,是因为所有的卷积核之和为1才行
'''
def custom_blur(image):kernel1 = np.ones([5,5],np.float32)/25 #需要满足卷积核之和为1故需要除以25dst1 = cv2.filter2D(image,-1,kernel=kernel1)cv2.imshow("custom_blur_1",dst1)kernel2 = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9 #需要满足卷积核之和为1故需要除以9dst2 = cv2.filter2D(image,-1,kernel=kernel2)cv2.imshow("custom_blur_2",dst2)kernel3 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)#这个卷积核实际上就是图像的锐化dst3 = cv2.filter2D(image,-1,kernel=kernel3)cv2.imshow("custom_blur_3",dst3)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
custom_blur(src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下: