iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 21

【Day21-濾波】圖片也有頻率?影像資料如何做濾波?

前一天我們討論了圖片的顏色,今天就來討論一下圖片的頻率和一些簡單的特徵處理技巧

圖片也有頻率?

在處理聲音訊號的時候我們有用到傅立葉分析的方式來取得聲音訊號的頻率特徵,一維訊號隨著時間而有不同頻率的變化很好理解,不過圖片又會有什麼頻率呢?其實就是沿著橫軸和縱軸分別去看其變化的頻率。這部分我們可以一樣用傅立葉的方式去做,也可以用濾波的方式去做

基本的圖形處理

卷積核(kernel)

不同的卷積核,會因為對原始圖片做卷積計算之後的不同結果而對應著不同的處理方方式

平滑化

對於一個需要平滑化的圖形,我們可以採用一個平均總和為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()


上一篇
【Day20-填充】二維圖片資料要怎麼做填充?
下一篇
【Day22-圖表】文不如表,表不如圖——使用seaborn一行透過圖表觀察資料!
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言