一、學習目標
- 了解什么是卷積
- 了解模糊的使用方法與應用
如有錯誤歡迎指出~
二、了解模糊的應用
上一篇:[python opencv 計算機視覺零基礎到實戰] 八、ROI泛洪填充
2.1 了解卷積是什么
在本節中,卷積我們不過多的進行深入講解,我本人對卷積也只是稍有理解,不敢過多的編寫太深的內容。在OpenCV中的模糊操作中,模糊需要用到卷積,在此引入賈志剛老師對于OpenCV的基本卷積的講解。
以下是一個基本卷積的圖示,第一列是一維數組中每一個位置的值。其中111我們稱為卷積核。通過卷積核與一維數組進行計算最終將會得到藍最下面的藍色方塊內的值。第一位我們照著寫下,藍色區域為1,藍色方塊內的第二個值為2,是如何得到的呢?很簡單,用卷積核的每一個數乘上淡青藍色的內容,那就是11,21,15,隨后將它們進行相加,除以卷積核的步長,也就是3。這是就可以寫成(11+21+15)/3等于2,余數為2,我們只取整數部分。之后的計算也是如此,包括二維的數據進行計算也是根據一維的計算原理一致。
2.2 均值模糊
在OpenCV中均值模糊使用blur函數,blur函數一般使用可以接收2個參數,一個是src為輸入的圖像,一個是ksize為卷積核大小;卷積核大小可以給予一個矩陣,如上圖所屬的111是1行3列的卷積核,那么就可以寫為(1,3)。模糊都可以去進行去噪操作,不同的模糊對于不同的噪點有不同的效果。均值模糊一般可以用在隨機噪點的圖片中,可以很好的去除噪點。
首先我們引入一張圖片:
import cv2img = cv2.imread(r"C:\Users\Administrator\Desktop\2.jpg")
cv2.imshow("img", img)
隨后使用blur均值模糊函數對圖片進行降噪:
blur_img=cv2.blur(img,(2,24))#圖片去噪
blur函數第一個參數是img,為我們即將要處理的圖片,第二個參數是(2,24),表示創建一個2行24列的卷積核進行卷積。最后顯示圖片并且進行等待,完整代碼如下:
import cv2img = cv2.imread(r"C:\Users\Administrator\Desktop\3.jpg")
cv2.imshow("img", img)
blur_img=cv2.blur(img,(2,24))#圖片去噪
cv2.imshow("blur_img", blur_img)
cv2.waitKey (0)#等待關閉
cv2.destroyAllWindows()#destroy
我們可以從圖片中看到,原圖是存在一定的噪點,但是進行均值模糊后會變淡很多,但是圖片會有一定模糊。
2.3 中值模糊
中值模糊使用medianBlur函數,medianBlur一般接收2個參數,一個是待處理的圖片,還有一個是核的大小,規定為大于1的奇數,例如3、5、7…
現在我有一張有椒鹽噪點的圖片:
中值模糊對于該類型的圖片進行降噪效果十分顯著。由于大多數代碼已經講解過,在此不再贅述,直接貼上代碼:
import cv2img = cv2.imread(r"C:\Users\Administrator\Desktop\2.jpg")
cv2.imshow("img", img)
median_blur_img=cv2.medianBlur(img,5)cv2.imshow("median_blur_img", median_blur_img)
cv2.waitKey (0)#等待關閉
cv2.destroyAllWindows()#destroy
以上代碼中使用了medianBlur中值模糊方法,傳入了照片,并且給予了核大小值5,該值越大,則越模糊。結果如下:
2.4 銳化
在OpenCV中我們可以自定義內核對圖像進行卷積,內核也有幾種不同標準的內容,可以給圖像進行卷積后達到一些指定的效果。自定義對內核進行卷積使用filter2D函數。函數原型如下:
cv.filter2D(src, ddepth, kernel)
src為待處理的圖像;ddepth一般使用為-1,表示與原圖像具有相同的深度;kernel為卷積核,為單通道浮點矩陣;由于我們進行初步使用直接使用一般的卷積核,這個時候直接傳入固定數據即可,所以再次并不進行深度說明。
進行銳化的卷積核為:
kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
傳入至filter2D函數則為:
cv2.filter2D(blur_img, -1, kernel)
現在我們將一個受到均值模糊的圖片使用filter2D函數進行銳化處理,完整代碼如下:
import cv2
import numpy as npimg = cv2.imread(r"C:\Users\Administrator\Desktop\4.jpg")
cv2.imshow("img", img)
blur_img=cv2.blur(img,(1,6))#圖片去噪
cv2.imshow("blur_img", blur_img)kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
dst = cv2.filter2D(blur_img, -1, kernel)
cv2.imshow("dst", dst)cv2.waitKey (0)#等待關閉
cv2.destroyAllWindows()#destroy
以上代碼中blur_img,是均值模糊后的圖片,我們將blur_img傳入值filter2D函數中使用指定的卷積核進行銳化,最后得到dst圖像數據。結果如下:
均值模糊:
銳化處理:
從圖片的結果可以看出,進行均值模糊后,再進行銳化,該圖片的編譯將得到加深。
2.4 浮雕
矩陣:
kernel=np.array([[-2,-1,0],[-1,1,1],[0,1,2]],np.float32)
有點鬼畜,不要笑。
2.5 大綱
矩陣:
kernel=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]],np.float32)
2.6 拉普拉斯算子
矩陣:
kernel=np.array([[0,1,0],[1,-4,1],[0,1,0]],np.float32)
2.7 分身原圖
矩陣:
kernel=np.array([[0,0,0],[0,1,0],[0,0,0]],np.float32)
該系列文章首發于ebaina
三、總結
- 了解了卷積卷積的運算方式
- 了解多種模糊的使用方法
- 了解了中值模糊對于椒鹽噪點有很好的去噪效果