看似花裏胡哨的標題下,其實只是寫了個量化器
首先第一個最樸素的想法就是
均勻量化器
這個沒啥好說的,就是將分爲255份,將原始數據轉化爲uint8形式。
詳見下
import numpy as np
import cv2 as cv
img = cv.imread('sample.jpg', cv.IMREAD_GRAYSCALE)
img_fft = np.fft.fftshift(np.fft.fft2(img))
margin = np.abs(img_fft)
log_mar = np.log(margin)
def eq(nums):
level = (np.max(nums) - np.min(nums)) / 255
res = np.uint8((nums - np.min(nums)) / level )
return res
visible_fft = eq(log_mar)
cv.imshow('origin', img)
cv.imshow('fft', visible_fft)
cv.waitKey(0)
cv.destroyAllWindows()
疑車有據
雖然程序設計很簡單,但是仍有幾點需要我們注意的地方:
-
爲什麼要取對數
因爲FFT轉換後低頻分量非常大,如果不進行對數壓縮我們是看不到高頻分量的,表現在圖像上就只有中間有個大白點。我們取對數是爲了更好的顯示細節信息,也就是細微的高頻分量 -
爲什麼不能 先量化再取對數 而是 先取對數再量化
首先,先量化再對數壓縮,這是圖像的動態壓縮,將低灰度部分適當放大,高灰度壓縮,而FFT之後得到數據大部分都很小,所以先量化就都歸0了