如何在Python中将DCT应用于图像?
我想对Python中的图像应用离散余弦变换(以及逆变换),我想知道最好的方法是什么以及如何实现。我已经看过PIL和OpenCV,但我仍然不知道如何使用它。来自: DCT(src、dst、标志)→ 没有一个 执行一维或二维的正向或反向离散余弦变换 浮点数组。 参数: src(CvArr)–源阵列、实1D或2D阵列 dst(CvArr)–与源阵列大小和类型相同的目标阵列 旗帜(国际)– 转换标志,以下值的组合 CV_DXT_正向执行正向一维或二维变换。 CV_DXT_逆变换进行一维或二维逆变换。 CV_DXT_行对数据的每一行进行正变换或逆变换 输入矩阵。此标志允许用户同时变换多个向量 并且可以用来减少开销(有时要大好几倍) 而不是处理本身),进行3D和更高维度的变换等等。如何在Python中将DCT应用于图像?,python,opencv,image-processing,scipy,dct,Python,Opencv,Image Processing,Scipy,Dct,我想对Python中的图像应用离散余弦变换(以及逆变换),我想知道最好的方法是什么以及如何实现。我已经看过PIL和OpenCV,但我仍然不知道如何使用它。来自: DCT(src、dst、标志)→ 没有一个 执行一维或二维的正向或反向离散余弦变换 浮点数组。 参数: src(CvArr)–源阵列、实1D或2D阵列 dst(CvArr)–与源阵列大小和类型相同的目标阵列 旗帜(国际)– 转换标志,以下值的组合 CV_DXT_正向执行正向一维或二维变换。 CV_DXT_逆变换进行一维或二维逆变换。 C
DCT在中也可用 带有
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
域中),您将得到如下图(带有棋盘格图案):
不完全确定PIL和OpenCV,但应用DCT和逆DCT基本上是将源块乘以相关的变换矩阵。您能提供一个基本程序来显示其用法吗?Python似乎抱怨我的目标数组是空的。实际上,我所做的是使用PIL来调整输入图像的大小,然后使用cv.CreateImageHeader来创建源数组和空的目标数组。不确定这是否正确。我实际上没有使用OpenCV,所以这是我所有的信息。你可以试着询问他们的邮件列表;有一些通用的好例子。
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()