卷積
什么是二維卷積呢?看下面一張圖就一目了然:
卷積就是循環對圖像跟一個核逐個元素相乘再求和得到另外一副圖像的操作,比如結果圖中第一個元素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(邊緣填充)
圖像卷積后大小可參考 卷積和反卷積后圖像大小
那么擴展的這一層應該填充什么值呢?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
默認填充方式
默認邊框cv.BORDER_DEFAULT其實是取鏡像對稱的像素填充。
圖解默認填充方式
代碼
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()