我想在Python中对一张图片应用离散余弦变换(以及逆变换),但我不知道最好的方法和具体操作步骤。我已经查看了PIL和OpenCV的相关文档,但仍然不理解如何使用。
我想在Python中对一张图片应用离散余弦变换(以及逆变换),但我不知道最好的方法和具体操作步骤。我已经查看了PIL和OpenCV的相关文档,但仍然不理解如何使用。
使用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
域表示),则会得到类似下面这样的图案(带有棋盘格纹):
来自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。