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