如何将 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期