如何用cv.imshow显示FFT

看似花里胡哨的标题下,其实只是写了个量化器

首先第一个最朴素的想法就是

均匀量化器

这个没啥好说的,就是将 [ m i n ( a r r a y ) , m a x ( a r r a y ) ] [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了

猜你喜欢

转载自blog.csdn.net/white_156/article/details/104620114
今日推荐