为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇潇雨雨 2022-07-19 15:36:00
我有两张图片:原始图像二值化图像我通过将 256x256 图像划分为 8x8 块,对这两个图像应用了离散余弦变换。之后,我想比较他们的 DCT 系数分布。import matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.pylab as pylabimport numpy as npimport os.pathimport scipyimport statisticsfrom numpy import pifrom numpy import sinfrom numpy import zerosfrom numpy import r_from PIL import Imagefrom scipy.fftpack import fft, dctfrom scipy import signalfrom scipy import miscif __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 系数分布,如下图所示:我的问题是:图中的X和Y-axis代表什么?值是否存储在noise_dct_data和ground_truth_dct_data中,DCT 系数?是否Y-axis表示其对应的 DCT 系数的频率?直方图是否适合表示 DCT 系数分布。DCT系数通常根据它们的频率分为三个子带,即低、中和高频带。我们可以用来在低、中或高频段对 DCT 系数进行分类的阈值是多少?换句话说,我们如何对DCT系数频带进行径向分类?以下是 DCT 系数频带的径向分类的示例。
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

在我看来,您分享的绘图示例就像核密度图。密度图“直方图的一种变体,它使用核平滑来绘制值,通过平滑噪声来实现更平滑的分布。” (见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 轴表示具有这些值的观察数。与直方图不同,它应用了一种平滑方法来尝试估计噪声观测数据背后的数据“真实”分布。

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),但这看起来像是一种在频率数据上训练监督模型以进行预测的方法扫描的整体质量。

关于数据分区,他们指出,“为了从局部图像块中捕获方向信息,DCT 块被定向分区。......上、中和下分区对应于低频、中频和高频 DCT 子带。"

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

查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信