如何用cv.imshow顯示FFT

看似花裏胡哨的標題下,其實只是寫了個量化器

首先第一個最樸素的想法就是

均勻量化器

這個沒啥好說的,就是將[min(array),max(array)][min(array),max(array)]分爲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()

疑車有據
在這裏插入圖片描述
雖然程序設計很簡單,但是仍有幾點需要我們注意的地方:

  1. 爲什麼要取對數
    因爲FFT轉換後低頻分量非常大,如果不進行對數壓縮我們是看不到高頻分量的,表現在圖像上就只有中間有個大白點。我們取對數是爲了更好的顯示細節信息,也就是細微的高頻分量

  2. 爲什麼不能 先量化再取對數 而是 先取對數再量化
    首先,先量化再對數壓縮,這是圖像的動態壓縮,將低灰度部分適當放大,高灰度壓縮,而FFT之後得到數據大部分都很小,所以先量化就都歸0了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章