如何在不损失太多质量的情况下丢弃频域中的系数?

信息处理 fft Python 频域 dct scipy
2022-02-13 15:11:06

我正在阅读一篇文本,该文本显示可以丢弃 66% 的系数并获得仍然可以接受的图像。

我尝试使用 python 复制它(最后一个示例)并有选择地丢弃一些系数,但我无法获得出色的图像,我的看起来像一个幽灵。

我怎样才能丢弃对图像不那么重要的东西?

fft 丢弃系数示例

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
from scipy import signal

# loading the image
img = mpimg.imread('i/super_mario_head.png')

# image in frequency domain
fft_original = np.fft.rfft2(img)

# discarding some coefficients (except initial square 80x80)
for x in range(300):
    for y in range(300):
        discard_x = x > 80
        discard_y = y > 80

        if discard_x and discard_y:
            fft_original[x,y] = 0

# reverse from frequency to spatial
i_fft_original = np.fft.irfft2(fft_original)

f, (plt1, plt2) = plt.subplots(1, 2, figsize=(15,15))

plt1.axis('off');plt1.set_title('Original');plt1.imshow(img[:,:,0], cmap='gray');
plt2.axis('off');plt2.set_title('Reversed');plt2.imshow(i_fft_original[:,:,0], cmap='gray');
2个回答

在检查它们当前的大小是否很小(小于通常可见的值)之前,您正在丢弃系数。

(您可能还想重新调整剩余的比例以保持总能量。)

找到 fft_original 的最大值,然后使用它的 1/N 倍的阈值 - 比如 1/10。还与每个样本的绝对值进行比较,以便保留高幅度负值。