如何将 DCT 应用于 Python 中的图像?

Posted

技术标签:

【中文标题】如何将 DCT 应用于 Python 中的图像?【英文标题】:How do I apply a DCT to an image in Python? 【发布时间】:2011-10-29 23:13:13 【问题描述】:

我想对 Python 中的图像应用离散余弦变换(以及逆变换),我想知道最好的方法是什么以及如何做。我看过 PIL 和 OpenCV,但我仍然不明白如何使用它。

【问题讨论】:

不完全确定 PIL 和 OpenCV,但同时应用 DCT 和逆 DCT 基本上是将源块乘以相关的变换矩阵。 【参考方案1】:

来自OpenCV:

DCT(src, dst, flags) → 无 执行一维或二维的正向或反向离散余弦变换 浮点数组。 参数: src (CvArr) – 源数组,真正的一维或二维数组 dst (CvArr) – 与源具有相同大小和类型的目标数组 标志(int)—— 转换标志,以下值的组合 CV_DXT_FORWARD 做一个前向 1D 或 2D 变换。 CV_DXT_INVERSE 进行一维或二维逆变换。 CV_DXT_ROWS 对每个单独的行进行正向或逆变换 输入矩阵。此标志允许用户同时转换多个向量 并且可以用来减少开销(有时会大几倍 比处理本身),进行 3D 和更高维的变换等等。

Here is an example of it being used.

DCT 也可在scipy.fftpack 中获得。

【讨论】:

你能提供一个基本的程序来显示它的用法吗? Python 似乎抱怨我的目标数组是空的。 基本上我所做的是使用 PIL 调整输入图像的大小,然后使用 cv.CreateImageHeader 创建源以及一个空的目标数组。不确定这是否正确。 Here is an example of it being used 我实际上并没有使用 OpenCV,所以这就是我所拥有的所有信息。您可以尝试在他们的邮件列表中询问; this cookbook page 有一些很好的一般用法示例。【参考方案2】:

scipy.fftpack 为例:

from scipy.fftpack import dct, idct

# implement 2D DCT
def dct2(a):
    return dct(dct(a.T, norm='ortho').T, norm='ortho')

# implement 2D IDCT
def idct2(a):
    return idct(idct(a.T, norm='ortho').T, norm='ortho')    

from skimage.io import imread
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pylab as plt

# read lena RGB image and convert to grayscale
im = rgb2gray(imread('images/lena.jpg')) 
imF = dct2(im)
im1 = idct2(imF)

# check if the reconstructed image is nearly equal to the original image
np.allclose(im, im1)
# True

# plot original and reconstructed images with matplotlib.pylab
plt.gray()
plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('original image', size=20)
plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('reconstructed image (DCT+IDCT)', size=20)
plt.show()

此外,如果您绘制2D DCT 系数数组imF 的一小部分(在log 域中),您将得到如下图(带有棋盘图案):

【讨论】:

以上是关于如何将 DCT 应用于 Python 中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

图像融合基于matlab DCT域多焦点图像融合含Matlab源码 1973期

为啥 DCT 变换在视频/图像压缩中优于其他变换

从编码图像和视频中提取 DCT 系数

JPEG基本系统

图像隐写基于matlab GUI DCT变换图像隐写含Matlab源码 1380期

图像压缩基于matlab GUI DCT图像无损压缩含Matlab源码 726期