如何在Python中对图像应用DCT?

21

我想在Python中对一张图片应用离散余弦变换(以及逆变换),但我不知道最好的方法和具体操作步骤。我已经查看了PIL和OpenCV的相关文档,但仍然不理解如何使用。


不太确定PIL和OpenCV,但应用DCT和反DCT都基本上是将源块乘以相关的变换矩阵。 - Andrey Agibalov
2个回答

14

使用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域表示),则会得到类似下面这样的图案(带有棋盘格纹):

enter image description here


1
你能分享一下显示DCT系数的代码吗?我做得不太对,可能是因为matplotlib的比例尺? - Matthieu

12

来自OpenCV:

DCT(src, dst, flags) → None

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

这里有一个使用它的例子

scipy.fftpack中也提供了DCT。


你能提供一个基本程序来显示它的用法吗?Python似乎抱怨我的目标数组为空。 - jmnwong
基本上我所做的是使用PIL来调整输入图像的大小,然后使用cv.CreateImageHeader创建源以及一个空的目标数组。不确定这是否正确。 - jmnwong
这里是使用它的例子:http://blog.weisu.org/2007/11/opencv-dct-and-idct.html - agf
我实际上并没有使用OpenCV,所以这就是我拥有的所有信息。你可以尝试在他们的邮件列表上询问;这个食谱页面有一些关于一般用法的好例子。 - agf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接