Python二维离散余弦变换图像压缩应用(基于OpenCV)

离散余弦变换的特征是将物体信息能量汇聚到低频成分,高频成分接近0,因此被用于语音和图像处理领域。

在图像压缩存储中,可以将原始图像进行二维离散余弦变换,然后存储含有信息的低频部分的数据。在图像还原过程中,通过这些携带信息的低频数据就可以还原原始大小的图像。

Python程序如下:

# -*- coding: -utf-8 -*-
# Python版本:Python3.5
#库:numpy,opencv,matplotlib
#基于离散余弦变换DCT的图像压缩
#  作者:James_Ray_Murpy
# 2018/01/25

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

img = cv2.imread('11.jpg', 0)   #读取图片,

img1 = img.astype('float')        #将uint8转化为float类型

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

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

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

# 图片压缩,只保留100*100的数据
recor_temp = img_dct[0:100,0:100]
recor_temp2 = np.zeros(img.shape)
recor_temp2[0:100,0:100] = recor_temp
#压缩图片恢复
img_recor1 = cv2.idct(recor_temp2)

#显示
plt.subplot(221)
plt.imshow(img)
plt.title('original')

plt.subplot(222)
plt.imshow(img_dct_log)
plt.title('dct transformed')

plt.subplot(223)
plt.imshow(img_recor)
plt.title('idct transformed')

plt.subplot(224)
plt.imshow(img_recor1)
plt.title('idct transformed2')

plt.show()
效果图如下:



  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的使用C++实现离散余弦变换压缩图像的例子: ```c++ #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; // 定义DCT变换函数 void dct(Mat& img, Mat& dctImg) { dct(img, dctImg, DCT_INVERSE); } // 定义IDCT变换函数 void idct(Mat& dctImg, Mat& img) { dct(dctImg, img, DCT_SCALE); } // 定义压缩函数 void compress(Mat& img, int q) { Mat dctImg; dct(img, dctImg); // 量化系数 int qMat[8][8] = { {16, 11, 10, 16, 24, 40, 51, 61}, {12, 12, 14, 19, 26, 58, 60, 55}, {14, 13, 16, 24, 40, 57, 69, 56}, {14, 17, 22, 29, 51, 87, 80, 62}, {18, 22, 37, 56, 68, 109, 103, 77}, {24, 35, 55, 64, 81, 104, 113, 92}, {49, 64, 78, 87, 103, 121, 120, 101}, {72, 92, 95, 98, 112, 100, 103, 99} }; for (int i = 0; i < dctImg.rows; i += 8) { for (int j = 0; j < dctImg.cols; j += 8) { // 量化 for (int k = 0; k < 8; k++) { for (int l = 0; l < 8; l++) { dctImg.at<float>(i + k, j + l) = round(dctImg.at<float>(i + k, j + l) / (qMat[k][l] * q)); } } } } idct(dctImg, img); } int main() { Mat img = imread("test.jpg", IMREAD_GRAYSCALE); imshow("Original", img); Mat compressedImg; compress(img, 10); imshow("Compressed", compressedImg); waitKey(0); return 0; } ``` 在这个例子中,我们使用OpenCV库提供的DCT函数来进行变换。压缩函数中,我们使用一个8x8的量化矩阵来进行量化。量化系数q可以调整压缩效果。在这个例子中,我们将其设置为10。最后,我们使用IDCT函数将变换后的图像转换回空间域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值