首页 > 编程知识 正文

用python画余弦的代码,MATLAB像处理离散余弦变换

时间:2023-05-04 13:11:10 阅读:228885 作者:2105

目录 前言理论准备离散余弦变换与傅里叶变换的区别离散余弦变换的适用性 代码实现如果不进行数据类型转换float32,就会报错显示dct变换过程中图像数据变化压缩和压缩恢复变化

前言

在阅读本文章之前需要参考文章
https://blog.csdn.net/qq_41821067/article/details/111143629
https://blog.csdn.net/jacke121/article/details/80434744

理论准备 离散余弦变换与傅里叶变换的区别

离散余弦变换与傅里叶变换相关,只使用实偶函数,长度相当于是两倍的傅里叶变换。

离散余弦变换的适用性

离散余弦变换的特征是将物理信息能量汇聚到低频成分,高频成分接近于0,因此被用语音和图像处理领域。
适用于图像压缩,在图像压缩的时候会丢失到图像部分信息,可以将原始图像进行二维离散余弦变换,然后将存储含有信息的低频成分的数据,图像还原的时候将携带数据的低频数据就可以还原原始图像。

代码实现 import cv2import numpy as npimg=cv2.imread('F:/people.png',0)# 读取图像变为灰度图像img1=img.astype('float32')#将unit8类型转换为float类型#进行离散余弦变换img_dct=cv2.dct(img1)print(img_dct)

下图是通过离散余弦变换的数值

如果不进行数据类型转换float32,就会报错

我们将没有进行float32转换的img放入dct变换的参数,出现类型不符错误

显示dct变换过程中图像数据变化 import numpy as npimport matplotlib.pyplot as pltimport cv2img=cv2.imread('F:/people.png',0)# 读取图像变为灰度图像print(img)print("------------------")img1=img.astype('float32')#将unit8类型转换为float32类型print(img1)print("------------------")#进行离散余弦变换img_dct=cv2.dct(img1)print(img_dct)print("------------------")#进行log 处理img_dct_log=np.log(abs(img_dct))#进行离散余弦反变换img_recor=cv2.idct(img_dct)print(img_dct.shape)print("------------------")print(img_recor)




压缩和压缩恢复变化 print(img_dct.shape)zip_len=90#图片压缩,只保留90*90的数据,就是图片的shape变为90*90recor_temp=img_dct[0:zip_len,0:zip_len]print(recor_temp.shape)


我们可以看到图片没有经过压缩的大小是143 * 93,压缩后的大小是90 * 90

import numpy as npimport matplotlib.pyplot as pltimport cv2img=cv2.imread('F:/people.png',0)# 读取图像变为灰度图像img1=img.astype('float32')#将unit8类型转换为float32类型#进行离散余弦变换img_dct=cv2.dct(img1)#进行log 处理img_dct_log=np.log(abs(img_dct))#进行离散余弦反变换img_recor=cv2.idct(img_dct)#print(img_recor)print(img_dct.shape)zip_len=90#图片压缩,只保留90*90的数据,就是图片的shape变为90*90recor_temp=img_dct[0:zip_len,0:zip_len]print(recor_temp.shape)#建立一个143*93的0数组recor_temp2=np.zeros(img.shape)#将压缩后的离散余弦变换图覆盖0数组,也就是将压缩图像恢复为原来图像大小,其余填充为0recor_temp2[0:zip_len,0:zip_len]=recor_temp#print(recor_temp2)recor_temp2_float=recor_temp2.astype('float32')img_recor_recor=cv2.idct(recor_temp2_float)# 显示plt.subplot(221)plt.imshow(img)plt.title('original')plt.subplot(222)plt.imshow(img_dct_log)plt.title("dct_log")plt.subplot(223)plt.imshow(img_recor)plt.title("img_recor")plt.subplot(224)plt.imshow(img_recor_recor)plt.title("img_recor_recor")plt.show()

可以看到第三张图片未压缩恢复和第四张压缩后恢复的图片。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。