OpenCV实现基于8*8块DCT变换的图像压缩

这几天一直在看MPEG编解码的原理,由于利用ffmpeg实在提不出DCT系数,就根据MPEG的编码原理来看看这个DCT系数到底什么样,于是在OpenCV中实现了一下图像压缩这一块,基于8*8块DCT变换,同时也再进行了一下反变换,最后得到了原图。

代码如下:

#include "highgui.h"
#include <cv.h>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{

	Mat img = imread("1.jpg");
	
	//分解为YUV颜色空间
	Mat YUVImage;
	cvtColor(img,YUVImage,CV_BGR2YUV);
	
	//分解为三个通道
	vector<Mat> YUV;
	split(YUVImage,YUV);
	
	//先转换下格式
	Mat float_Y,float_U,float_V;
	YUV[0].convertTo(float_Y,CV_64FC1);
	YUV[1].convertTo(float_U,CV_64FC1);
	YUV[2].convertTo(float_V,CV_64FC1);

   //基于8*8块的DCT变换及其反变换
	Rect windows;		 //利用这个8*8的矩形来进行8*8块的DCT变换
	//DCT变换
	Mat DCTU,DCTV,DCTY;
	float_Y.copyTo(DCTY);		
	float_U.copyTo(DCTU);
	float_V.copyTo(DCTV);


	for (int i = 0;i<img.cols/8;i++)
	{
		for (int j = 0;j<img.rows/8;j++)
		{
			windows.x = 8 * i;
			windows.
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值