opencv 對圖像進行卷積

卷積

什麼是二維卷積呢?看下面一張圖就一目瞭然:
圖解卷積過程
卷積就是循環對圖像跟一個核逐個元素相乘再求和得到另外一副圖像的操作,比如結果圖中第一個元素5是怎麼算的呢?原圖中3×3的區域與3×3的核逐個元素相乘再相加:
5=1×1+2×0+1×0+0×0+1×0+1×0+3×0+0×0+2×2
算完之後,整個框再往右移一步繼續計算,橫向計算完後,再往下移一步繼續計算。
簡而言之,卷積是一個對應位置像素值相乘後再相加的操作。
不難發現,前面我們用3×3的核對一副6×6的圖像進行卷積,得到的是4×4的圖,圖片縮小了!那怎麼辦呢?我們可以把原圖擴充一圈,再卷積,這個操作叫填充padding。

padding(邊緣填充)

圖像卷積後大小可參考 卷積和反捲積後圖像大小

圖解padding
那麼擴展的這一層應該填充什麼值呢?OpenCV中有好幾種填充方式,都使用 cv.copyMakeBorder() 函數實現,一起來看看。

cv.copyMakeBorder() 參數講解
src:要處理的原圖
top, bottom, left, right:上下左右要擴展的像素數
borderType:邊框類型,這個就是需要關注的填充方式。其中默認方式和固定值方式最常用

邊緣填充方式

固定值填充

顧名思義,cv.BORDER_CONSTANT 這種方式就是邊框都填充成一個固定的值,比如下面的程序都填充0:

代碼

img = cv.imread('baby_gg.bmp', 0)
print(img)
# 固定值邊框,統一都填充0也稱爲zero padding
cons = cv.copyMakeBorder(img, 1, 1, 1, 1, cv.BORDER_CONSTANT, value=0)
print(cons)

圖解固定值padding

圖解固定值爲0的填充方式

默認填充方式

默認邊框cv.BORDER_DEFAULT其實是取鏡像對稱的像素填充。

圖解默認填充方式

取邊緣對稱的像素值進行填充(默認方式)第1步
取邊緣對稱的像素值進行填充(默認方式)第2步和第3步

代碼

default = cv.copyMakeBorder(img, 1, 1, 1, 1, cv.BORDER_DEFAULT)
print(default)

opencv對圖像進行卷積

OpenCV中用 cv2.filter2D() 實現卷積操作,比如我們的核是下面這樣(3×3區域像素的和除以10):
卷積核

代碼

# 基本卷積操作
import cv2 as cv
import numpy as np

img = cv.imread('paojie.jpg')
# 定義卷積核
kernel = np.ones((3, 3), np.float32) / 10
# 卷積操作,-1表示通道數與原圖相同
dst = cv.filter2D(img, -1, kernel)
# 兩張圖片橫向合併,便於對比顯示
result = np.hstack((img,dst))

cv.imshow('result',result)
cv.waitKey(0)
cv.destroyAllWindows()

實驗結果

實驗結果:左圖(原圖),右圖(類似均值卷積核作用後,圖像模糊了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章