Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将DCT应用于图像?_Python_Opencv_Image Processing_Scipy_Dct - Fatal编程技术网

如何在Python中将DCT应用于图像?

如何在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

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

来自:

DCT(src、dst、标志)→ 没有一个 执行一维或二维的正向或反向离散余弦变换 浮点数组。 参数: src(CvArr)–源阵列、实1D或2D阵列 dst(CvArr)–与源阵列大小和类型相同的目标阵列 旗帜(国际)– 转换标志,以下值的组合 CV_DXT_正向执行正向一维或二维变换。 CV_DXT_逆变换进行一维或二维逆变换。 CV_DXT_行对数据的每一行进行正变换或逆变换 输入矩阵。此标志允许用户同时变换多个向量 并且可以用来减少开销(有时要大好几倍) 而不是处理本身),进行3D和更高维度的变换等等。


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()