一、學習目標
了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄
「python opencv 計算機視覺零基礎實戰」 第一節
「python opencv視覺入門到實戰」二、格式與攝像頭
「python opencv 視覺入門到實戰」 三、圖像編輯
「python opencv視覺入門到實戰」 第四節色彩空間
「python opencv視覺入門到實戰」 五、對象追蹤
「python opencv視覺零基礎到實戰」 六、圖像運算
「python opencv視覺零基礎實戰」 七邏輯運算應用
「python opencv視覺零到實戰」 八、圖片選區操作
「python opencv計算機視覺零基礎到實戰」 九模糊
如有錯誤歡迎指出~
二、了解模糊與美顏
2.1 使用高斯模糊降噪
由於很多小夥伴反應拋開原理或理論講解使用用法對於初學者來說會很舒服,從本節開始將會以比較簡單的方式進行講解相關API的應用。
首先我們有一張圖:
這張圖存在很多的噪點,那如何對該圖片進行降噪呢?學過前幾節的同學可能對降噪還是挺了解的。可能有些同學會說均值模糊和中值模糊。那我們先試試中值模糊:首先獲取圖片:
import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')dst=cv2.medianBlur(img,5)隨後進行中值模糊,並等待:
cv2.imshow("img", dst)cv2.waitKey (0)cv2.destroyAllWindows()結果如下:
從結果中可以得知,確實降噪的效果不錯,但是有一定的糊。現在我們再試試均值模糊。把中值模糊代碼改為:
dst=cv2.blur(img,(2,24))結果如下:
感覺更糊了,現在我們用我們高斯模糊試試水。高斯模糊使用API GaussianBlur,高斯模糊使用加權平均法對該半徑、範圍進行模糊。GaussianBlur方法原型如下:
cv2.GaussianBlur( SRC,ksize,sigmaX )我們在當前代碼中使用中可以按如下參數傳遞:
dst=cv2.GaussianBlur(img,(5,5),0) 其中img是要進行模糊的圖像,(5,5)是高斯核的大小,一般核大小都是奇數,最後一個為標準差,我們直接取0即可。若我(5,5)寫成(1,1)則表示不對原始圖像做操作。核越大圖像的模糊程度越大。適當取合適值可以使圖片模糊度不至於過糊。如果需要進行過濾圖像的大小相等時,那麼一般(5,5)的兩個值都是一樣,其實可以看做一個比例大小。我們添加原圖顯示與高斯模糊後的效果進行對比,完整代碼如下:
import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')dst=cv2.GaussianBlur(img,(5,5),0) cv2.namedWindow("Image",cv2.WINDOW_NORMAL)cv2.imshow("Image", img)cv2.imshow("Gaussian", dst)cv2.waitKey (0)cv2.destroyAllWindows()結果如下:
從圖片上來看高斯模糊對於整個輪廓的改變效果還是挺小的。其實高斯模糊對於我們來說應該是挺熟悉的,高斯模糊在一些圖片處理軟體上會用來對圖片增加毛玻璃效果。這時我們只需要將核大小置零,隨後更改方差值,這時就會出現毛玻璃效果。代碼如下:
dst=cv2.GaussianBlur(img,(0,0),20)
2.2 自己編寫噪點圖片
其實2.1中的噪點圖片是我自己編輯而成,那自己如何編寫類似的噪點圖片呢?很簡單只需要遍歷圖片大小即可。遍歷圖片大小對像素點進行隨機值的增加。如何遍歷圖片?只需要獲取圖片的寬高,對圖片進行遍歷即可。首先我們讀取圖片後對圖片進行寬高獲取:
import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')h,w,c=img.shape隨後遍歷每個像素點:
for row in range(h): for col in range(w): b=img[row,col,0] g=img[row,col,1] r=img[row,col,2]以上外層循環中遍歷高元素,隨後內層循環遍歷每個高元素的寬度元素;在寬度元素中獲取3個通道的值。有些小夥伴可能會說,為什麼獲取3個通道的值不使用循環?那是因為若使用循環會導致複雜度增加,會讓程序運行得更慢,所以為了減少複雜度,在這裡我使用了較為「笨」的方法直接讀取3個通道的值。隨後隨意生成一個3位隨機數,對該圖片的像素點進行增加:
srand=np.random.normal(0,30,3)img[row,col,0]=b+srand[0]img[row,col,1]=g+srand[1]img[row,col,2]=r+srand[2]結果如下:
咦?那為什麼變成這個樣子了?先別急,我們直接使用高斯模糊進行降噪吧:
dst=cv2.GaussianBlur(img,(5,5),0)結果如下:
咦?感覺降噪效果還不錯,這個時候我們就應該明白,「高斯模糊使用加權平均法對該半徑、範圍進行模糊」,我們可以很清楚的從結果圖中看見噪聲在該色值周圍得到了一定的「還原」。
好了,我們現在來探究為什麼這個圖編輯了隨機值後有的會白白的。那是因為我們沒有做「溢出」計算;我們在計算值的增減時應該考慮該值是否超過了255又或者是否小於了0,若小於0則置0,若大於255則等於255。因為如果我們加上一個值,小於0,那麼表示這個值本身偏暗,直接置0所偏向並沒有改變;若大於255則表示偏亮,直接等於255不會改變顏色的偏向,所以這樣做是沒問題的,極大限度的保留了原圖的基本樣貌。那麼此時的代碼的完整代碼如下:
import cv2import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\111.png')h,w,c=img.shapefor row in range(h): for col in range(w): srand=np.random.normal(0,30,3) b=img[row,col,0] g=img[row,col,1] r=img[row,col,2] if b+srand[0]>255: img[row,col,0]=255 elif b+srand[0]<0: img[row,col,0]=0 else: img[row,col,0]=b+srand[0] if g+srand[1]>255: img[row,col,1]=255 elif g+srand[1]<0: img[row,col,1]=0 else: img[row,col,1]=g+srand[1] if r+srand[2]>255: img[row,col,2]=255 elif r+srand[2]<0: img[row,col,2]=0 else: img[row,col,2]=r+srand[2]#dst=cv2.blur(img,(2,24))dst=cv2.GaussianBlur(img,(0,0),20) cv2.namedWindow("Image",cv2.WINDOW_NORMAL)cv2.imshow("Image", img)cv2.imshow("Gaussian", dst)cv2.waitKey (0)cv2.destroyAllWindows()結果如下:
該系列文章首發於ebaina,可點擊連結了解更多
三、總結
了解了製作噪聲圖片的注意事項,偏亮偏暗值需要等值賦予了解高斯模糊的使用方法及保留輪廓的特性