一、模糊操作基本原理
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()
效果圖如下: