基于Python二维离散余弦变换(DCT)及其反变换(IDCT)---程序对比

1.二维离散余弦变换(DCT)的原理见博客:点击打开链接

其中DCT和IDCT的变换基为:


OpenCV自带有DCT的程序,函数用法为:dst = cv2.dct(src), 其中src必须为float类型,uint8不能正常运行。

自己编写的dct程序和OpenCV自带的dct对比程序如下:

#二维图像的离散变余弦换(DCT)
#Python3.5
#库:cv2+numpy+matplotlib
#作者:James_Ray_Murphy

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('baoguo1.jpg', 0)

img1 = img.astype('float')

C_temp = np.zeros(img.shape)
dst = np.zeros(img.shape)


m, n = img.shape
N = n
C_temp[0, :] = 1 * np.sqrt(1/N)

for i in range(1, m):
     for j in range(n):
          C_temp[i, j] = np.cos(np.pi * i * (2*j+1) / (2 * N )
) * np.sqrt(2 / N )

dst = np.dot(C_temp , img1)
dst = np.dot(dst, np.transpose(C_temp))

dst1= np.log(abs(dst))  #进行log处理

img_recor = np.dot(np.transpose(C_temp) , dst)
img_recor1 = np.dot(img_recor, C_temp)

#自带方法

img_dct = cv2.dct(img1)         #进行离散余弦变换

img_dct_log = np.log(abs(img_dct))  #进行log处理

img_recor2 = cv2.idct(img_dct)    #进行离散余弦反变换


plt.subplot(231)
plt.imshow(img1, 'gray')
plt.title('original image')
plt.xticks([]), plt.yticks([])

plt.subplot(232)
plt.imshow(dst1)
plt.title('DCT1')
plt.xticks([]), plt.yticks([])


plt.subplot(233)
plt.imshow(img_recor1, 'gray')
plt.title('IDCT1')
plt.xticks([]), plt.yticks([])

plt.subplot(234)
plt.imshow(img, 'gray')
plt.title('original image')

plt.subplot(235)
plt.imshow(img_dct_log)
plt.title('DCT2(cv2_dct)')

plt.subplot(236)
plt.imshow(img_recor2,'gray')
plt.title('IDCT2(cv2_idct)')

plt.show()
效果图如下:



猜你喜欢

转载自blog.csdn.net/James_Ray_Murphy/article/details/79173388