19

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

4

2 回答 2

11

来自OpenCV

DCT(src, dst, flags) → 无

    执行一维或二维的正向或反向离散余弦变换
    浮点数组。

    参数:

        src (CvArr) – 源数组,真正的一维或二维数组
        dst (CvArr) – 与源具有相同大小和类型的目标数组
        标志(int)——

        转换标志,以下值的组合
            CV_DXT_FORWARD 做一个前向 1D 或 2D 变换。
            CV_DXT_INVERSE 进行一维或二维逆变换。
            CV_DXT_ROWS 对每个单独的行进行正向或逆变换
输入矩阵。此标志允许用户同时转换多个向量
并且可以用来减少开销(有时会大几倍
比处理本身),进行 3D 和更高维的变换等等。

这是一个使用它的例子

DCT 也可以在scipy.fftpack中找到。

于 2011-08-18T16:37:48.627 回答
10

示例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域中),您将得到如下图(带有棋盘图案):

在此处输入图像描述

于 2020-03-21T23:53:14.963 回答