离散余弦变换 (DCT) 系数分布

Discrete Cosine Transform (DCT) Coefficient Distribution

我有两张图片:

原图

二值化图像

我通过将 256x256 图像分成 8x8 块,对两个图像应用了离散余弦变换。之后,我想比较他们的 DCT 系数分布。

import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import numpy as np
import os.path
import scipy
import statistics

from numpy import pi
from numpy import sin
from numpy import zeros
from numpy import r_
from PIL import Image
from scipy.fftpack import fft, dct
from scipy import signal
from scipy import misc


if __name__ == '__main__':
    image_counter = 1

    #Opens the noisy image.
    noise_image_path = 'noise_images/' + str(image_counter) + '.png'
    noise_image = Image.open(noise_image_path)

    # Opens the binarize image
    ground_truth_image_path = 'ground_truth_noise_patches/' + str(image_counter) + '.png'
    ground_truth_image = Image.open( ground_truth_image_path)

    #Converts the images into Ndarray
    noise_image = np.array(noise_image)
    ground_truth_image = np.array(ground_truth_image)

    #Create variables `noise_dct_data` and `ground_truth_dct_data` where the DCT coefficients of the two images will be stored.
    noise_image_size = noise_image.shape
    noise_dct_data = np.zeros(noise_image_size)      
    ground_truth_image_size = ground_truth_image.shape
    ground_truth_dct_data = np.zeros(ground_truth_image_size)

    for i in r_[:noise_image_size[0]:8]:
        for j in r_[:noise_image_size[1]:8]:   
            # Apply DCT to the two images every 8x8 block of it.             
            noise_dct_data[i:(i+8),j:(j+8)] = dct(noise_image[i:(i+8),j:(j+8)])
            # Apply DCT to the binarize image every 8x8 block of it.   
            ground_truth_dct_data[i:(i+8),j:(j+8)] = dct(ground_truth_image[i:(i+8),j:(j+8)])

以上代码得到了两张图片的DCT。我想像下图一样创建他们的 DCT 系数分布:

问题是我不知道如何绘制它。以下是我所做的:

    #Convert 2D array to 1D array        
    noise_dct_data = noise_dct_data.ravel()   
    ground_truth_dct_data = ground_truth_dct_data.ravel()       

    #I just used a Histogram!
    n, bins, patches = plt.hist(ground_truth_dct_data, 2000, facecolor='blue', alpha=0.5)
    plt.show()

    n, bins, patches = plt.hist(noise_dct_data, 2000, facecolor='blue', alpha=0.5)
    plt.show()

    image_counter = image_counter + 1

我的问题是:

  1. 图中的XY-axis分别代表什么?
  2. noise_dct_dataground_truth_dct_data 中存储的值是 DCT 系数吗?
  3. Y-axis是否代表其对应的DCT系数的频率?
  4. 直方图是否适合表示DCT系数分布。
  5. DCT系数通常根据其频率分为三个子带,即低、中和高频带。我们可以用来对低、中或高频段的 DCT 系数进行分类的阈值是多少?换句话说,我们如何对DCT系数频带进行径向分类?下面是DCT系数频段径向分类的例子。

这个想法基于论文:Noise Characterization in Ancient Document Images Based on DCT Coefficient Distribution

在我看来,您分享的绘图示例就像核密度图。密度图 "a variation of a Histogram that uses kernel smoothing to plot values, allowing for smoother distributions by smoothing out the noise."(参见 https://datavizcatalogue.com/methods/density_plot.html

建立在matplotlib之上的seaborn库有一个kdeplot函数,它可以处理两组数据。这是一个玩具示例:

import numpy as np 
from scipy.fftpack import dct
import seaborn 

sample1 = dct(np.random.rand(100))
sample2 = dct(np.random.rand(30))
seaborn.kdeplot(sample1, color="r")
seaborn.kdeplot(sample2, color="b")

请注意,重新运行此代码会产生略有不同的图像,因为我使用的是随机生成的数据。

直接回答您的编号问题:

1.图中的X轴和Y轴分别代表什么?

在 kdeplot 中,X 轴表示密度,y 轴表示具有这些值的观测值的数量。与直方图不同,它应用平滑方法来尝试估计噪声观察数据背后的 "true" 数据分布。

2。值是否存储在 noise_dct_data 和 ground_truth_dct_data 中,即 DCT 系数?

根据您设置代码的方式,是的,这些变量存储了您执行的 DCT 转换的结果。

3。 Y轴是否代表其对应的DCT系数的频率?

是的,但有平滑处理。类似于直方图但不完全相同。

4。直方图是否适合表示DCT系数分布?

这取决于观察的数量,但如果您有足够的数据,直方图应该会给出非常相似的结果。

5. DCT系数通常基于它们的频率被分为三个子带,即低、中和高频带。我们可以用来对低、中或高频段的 DCT 系数进行分类的阈值是多少?也就是说,如何对DCT系数频段进行径向分类?

我认为这个问题可能太复杂了,无法在堆栈上令人满意地回答,但我的建议是尝试弄清楚文章的作者是如何完成这项任务的。引用的文章 "Blind Image Quality Assessment: A Natural Scene Statistics Approach in the DCT Domain" 似乎在谈论径向基函数 (RBF),但这看起来像是一种在频率数据上训练监督模型以预测扫描的整体质量的方法。

关于数据分区,他们说,"In order to capture directional information from the local image patches, the DCT block is partitioned directionally. ... The upper, middle, and lower partitions correspond to the low-frequency, mid-frequency, and high-frequency DCT subbands, respectively."

我认为,至少在他们的一种情况下,分区是由子带 DCT 确定的。 (参见 https://ieeexplore.ieee.org/document/499836)似乎有大量关于这些类型方法的文献。