实现正方形图片dct的c++代码(使用AXAT)

#include<iostream>
#include<fstream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;
const double pi = 3.141592;
void initDctMat(Mat &A)  //计算8x8块的离散余弦变换系数
{
	for (int i = 0; i < A.cols; ++i)
		for (int j = 0; j <A.rows; ++j)
		{
			float a;
			if (i == 0)
				a = sqrt(1.0 / A.rows);//--------
			else
				a = sqrt(2.0 / A.rows);
			A.ptr<float>(i)[j] = a*cos((j + 0.5)*pi*i / A.rows);
		}
}
//dct变换
void myDct(Mat &image, const Mat &A)
{
	image(Range(0, image.rows), Range(0, image.cols)) = A * image(Range(0, image.rows), Range(0, image.cols)) *A.t();//range函数是什么意思
}
int main()
{
	//读取图像,图像为灰度图,单通道
	Mat image = imread("pic.png", CV_LOAD_IMAGE_GRAYSCALE);
	Mat fimage;
	Mat A(Size(image.rows, image.cols), CV_32FC1);// 离散余弦系数矩阵---------定义矩阵的大小以及cv——32FC1??
	//显示原图
	if (!image.empty())
		imshow("image", image);
	//计算A系数
	initDctMat(A);
	//转换成浮点数矩阵,进行dct变换
	image.convertTo(fimage, CV_32FC1);//将图片转化成浮点数矩阵,然后进行dct的变换----------
	myDct(fimage, A);//参数为图片,离散余弦系数矩阵,mask量化,该函数的作用是进行dct变换,在函数中fimage当做x
	imshow("压缩图", fimage);//dct变换后的图片
	imshow("还原图", image);
	waitKey(0);
	return 0;
}

 

1、定义并计算出离散余弦变化系数。

2、初始化mask量化矩阵

3、将图像转化成浮点型矩阵//image.convertTo(fimage, CV_32FC1)

4、进行dct变换//参数:(浮点型矩阵,离散余弦变化系数,mask量化矩阵),步骤:将像素进行分块,X=AXAT,量化image/mask

5、将dct变化后的图片转化成非零矩阵,用非零点数/总数=压缩率并输出、

6、显示压缩图片:将dct变换后的矩阵转化成图片

7、进行idct变换//步骤:量化image.mul(mask)mutiply ,X=ATXA

8、显示原图:将idct变换后的矩阵转化为图片输出

 

 

G

M

T

 

 

 Detect languageAfrikaansAlbanianAmharicArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CorsicanCroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchFrisianGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHawaiianHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanKurdishKyrgyzLaoLatinLatvianLithuanianLuxembourgishMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPashtoPersianPolishPortuguesePunjabiRomanianRussianSamoanScots GaelicSerbianSesothoShonaSindhiSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshXhosaYiddishYorubaZulu

 

AfrikaansAlbanianAmharicArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CorsicanCroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchFrisianGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHawaiianHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanKurdishKyrgyzLaoLatinLatvianLithuanianLuxembourgishMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPashtoPersianPolishPortuguesePunjabiRomanianRussianSamoanScots GaelicSerbianSesothoShonaSindhiSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshXhosaYiddishYorubaZulu

 

 

 

 

 

 

 

 

 

Text-to-speech function is limited to 200 characters

 

 

 

Options : History : Feedback : DonateClose
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值