前一天我們討論了圖片的顏色,今天就來討論一下圖片的頻率和一些簡單的特徵處理技巧
在處理聲音訊號的時候我們有用到傅立葉分析的方式來取得聲音訊號的頻率特徵,一維訊號隨著時間而有不同頻率的變化很好理解,不過圖片又會有什麼頻率呢?其實就是沿著橫軸和縱軸分別去看其變化的頻率。這部分我們可以一樣用傅立葉的方式去做,也可以用濾波的方式去做
不同的卷積核,會因為對原始圖片做卷積計算之後的不同結果而對應著不同的處理方方式
對於一個需要平滑化的圖形,我們可以採用一個平均總和為1且所有元素相同的卷積核,例如
np.ones((5,5))/25
kernel = np.ones((5,5))/25
img_after = cv2.filter2D(img_origin, -1, kernel)
有的時候我們會需要將圖片模糊化,那這又是怎麼做的呢?
其實可以把模糊化想像成每一個原本的像素點分別像是墨水一樣擴散開來,中間雖然還是保留最多的資訊但也會有部分散到外面,且越遠的成分就越小
高斯分佈公式:
二維就是在兩個方向上做一樣的分佈,所以中間會是最大的
那這邊我們就需要構建一個二維的高斯分佈kernel,跳過一點數學論證我們直接看它應該長怎樣
import numpy as np
x, y = np.meshgrid(np.linspace(-1,1,7), np.linspace(-1,1,7)) # 建立二維
d = np.sqrt(x*x+y*y)
sigma, mu = 1.0, 0.0
kernel = np.exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) ) # 高斯分佈公式
kernel /= sum(sum(kernel)) #讓總和為1
plt.imshow(kernel)
plt.show()
# 來看看模糊化濾波的效果
img1_lpf = cv2.filter2D(img1, -1, kernel)
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(img1, "gray")
ax1.set_title("origin")
ax2.imshow(img1_lpf, "gray")
ax2.set_title("Low pass")
plt.show()
既然可以讓原本的圖片透過變化不明顯來達到模糊的目的,同樣的我們也可以反過來將圖片取出變化明顯的地方,對於用來尋找邊緣等目的一般蠻常用到類似的技巧的
# 用原始減去模糊當作新的kernel
kernel_high = np.zeros((7,7))
kernel_high[3][3] = 1
kernel_high -= kernel
img_hpf = cv2.filter2D(img1,-1,kernel_high)
plt.imshow(img_hpf,"gray")
plt.show()