我們在優化影像時,所採用的方法便是使用特定 kernel,針對整張影像進行捲積操作。
舉例來說,模糊(blur)、邊緣偵測(edge detection)、邊緣強化(edge enhancement)、噪點去除(noise removal)等,都是對影像進行捲積的結果。
當我們用kernel對影像由左上到右下移動,再進行運算,便會得出一幅經過 filtered 的新影像!
上圖運算過程: 藍色 grid 為定義的 3 × 3 kernel,在捲積過程進行中,底下覆蓋區域(圖中的紅色的 grid)與 kernel 進行交乘加總後(下方的 output pixel),將作為輸出新圖中該 kernel 區域的中心點
;若由左上至右下重複進行上述步驟,輪巡整張圖片後就會得到右邊的圖形。
執行 convolution 後,會發現輸出的圖片尺寸會比原來的小一圈
→ 為了保持影像完整,會使用我們提過的影像周圍補零(Zero padding)
使用cv2.filter2D
import numpy as np
import cv2
import sys
imageName = "123.jpg"
image = cv2.imread(imageName)
if image is None:
print("Could not open or find the image")
sys.exit()
kernel_size = 5 # 設定kernel size為5x5
# 使用numpy建立 5*5且值為1/(5**2)的矩陣作為kernel。
kernel = np.ones((kernel_size, kernel_size), dtype=np.float32) / kernel_size**2
print (kernel) # 顯示矩陣內容,所有值皆為0.04的5x5矩陣
#進行convolute,
result = cv2.filter2D(image, dst=-1, kernel=kernel, anchor=(-1, -1), delta=0, borderType=cv2.BORDER_DEFAULT)
cv2.imshow("Filter", result) #顯示影像
cv2.imshow("Original", image)
cv2.waitKey(0)
cv2.destroyAllWindows() #關閉影像視窗