一、學習目標
- 了解高斯模糊的使用方法
- 了解毛玻璃的圖片效果添加
- 了解如何自己做一個噪聲圖片
上一篇:[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 cv2
import 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]=255elif b+srand[0]<0:img[row,col,0]=0else:img[row,col,0]=b+srand[0]if g+srand[1]>255:img[row,col,1]=255elif g+srand[1]<0:img[row,col,1]=0else:img[row,col,1]=g+srand[1]if r+srand[2]>255:img[row,col,2]=255elif r+srand[2]<0:img[row,col,2]=0else: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
三、總結
- 了解了制作噪聲圖片的注意事項,偏亮偏暗值需要等值賦予
- 了解高斯模糊的使用方法及保留輪廓的特性