看似花里胡哨的标题下,其实只是写了个量化器
首先第一个最朴素的想法就是
均匀量化器
这个没啥好说的,就是将
分为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了