Как применить DCT к изображению в Python?

Я хочу применить дискретное косинусное преобразование (а также обратное) к изображению в Python, и мне интересно, как это лучше всего сделать и как. Я просмотрел PIL и OpenCV, но до сих пор не понимаю, как его использовать.


person jmnwong    schedule 18.08.2011    source источник
comment
Не совсем уверен в PIL и OpenCV, но применение как DCT, так и обратного DCT в основном умножает исходный блок на соответствующие матрицы преобразования.   -  person Andrey Agibalov    schedule 18.08.2011


Ответы (2)


Из OpenCV:

DCT(src, dst, flags) → None

    Performs a forward or inverse Discrete Cosine transform of a 1D or 2D 
    floating-point array.

    Parameters: 

        src (CvArr) – Source array, real 1D or 2D array
        dst (CvArr) – Destination array of the same size and same type as the source
        flags (int) –

        Transformation flags, a combination of the following values
            CV_DXT_FORWARD do a forward 1D or 2D transform.
            CV_DXT_INVERSE do an inverse 1D or 2D transform.
            CV_DXT_ROWS do a forward or inverse transform of every individual row of 
the input matrix. This flag allows user to transform multiple vectors simultaneously 
and can be used to decrease the overhead (which is sometimes several times larger 
than the processing itself), to do 3D and higher-dimensional transforms and so forth.

Вот пример его использования.

DCT также доступен в scipy.fftpack.

person agf    schedule 18.08.2011
comment
Не могли бы вы предоставить базовую программу для отображения ее использования? Python, похоже, жалуется, что мой целевой массив пуст. - person jmnwong; 19.08.2011
comment
По сути, я использовал PIL для изменения размера входного изображения, а затем использовал cv.CreateImageHeader для создания источника, а также пустого массива назначения. Не уверен, что это правильно. - person jmnwong; 19.08.2011
comment
На самом деле я не использую OpenCV, так что это вся информация, которая у меня есть. Вы можете попробовать спросить в их списке рассылки; эта страница кулинарной книги содержит несколько хороших примеров общего использования. - person agf; 19.08.2011

Пример с 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), вы получите фигуру, подобную следующей (с шаблоном шахматной доски):

введите описание изображения здесь

person Sandipan Dey    schedule 21.03.2020