用c++实现对图像的dct变换

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变换后的矩阵转化为图片输出

#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 < 8; ++i)
		for (int j = 0; j < 8; ++j)
		{
			float a;
			if (i == 0)
				a = sqrt(1.0 / 8.0);//--------
			else
				a = sqrt(2.0 / 8.0);
			A.ptr<float>(i)[j] = a*cos((j + 0.5)*pi*i / 8);
		}
}
//dct变换
void myDct(Mat &image, const Mat &A, const Mat &mask)
{
	//分块 8x8
	for (int i = 0; i < 256; i += 8)
		for (int j = 0; j < 256; j += 8)
		{

			//X = AXAT 
			image(Range(i, i + 8), Range(j, j + 8)) = A * image(Range(i, i + 8), Range(j, j + 8)) *A.t();//range()-------------------------------------
			//用mask量化
			image(Range(i, i + 8), Range(j, j + 8)) /= mask;//用mask对x进行量化

		}
}
//dct反变换
void myiDct(Mat &image, const Mat &A, const Mat &mask)
{
	//分块8x8
	for (int i = 0; i < 256; i += 8)
		for (int j = 0; j < 256; j += 8)
		{
			//还原量化
			image(Range(i, i + 8), Range(j, j + 8)) = image(Range(i, i + 8), Range(j, j + 8)).mul(mask);
			//X = ATXA
			image(Range(i, i + 8), Range(j, j + 8)) = A.t() * image(Range(i, i + 8), Range(j, j + 8)) * A;
		}
}
int main()
{
	//读取图像,图像为灰度图,单通道
	Mat image = imread("pic.png", CV_LOAD_IMAGE_GRAYSCALE);
	Mat fimage;
	Mat A(Size(8, 8), CV_32FC1);// 离散余弦系数矩阵---------定义矩阵的大小以及cv——32FC1??
	//初始化mask量化矩阵------------------------mask量化矩阵是基于什么得出来的
	float msk[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 } };
	Mat mask(8, 8, CV_32FC1, msk);
	//显示原图
	if (!image.empty())
		imshow("image", image);
	//计算A系数
	initDctMat(A);
	//转换成浮点数矩阵,进行dct变换
	image.convertTo(fimage, CV_32FC1);//将图片转化成浮点数矩阵,然后进行dct的变换----------
	myDct(fimage, A, mask);//参数为图片,离散余弦系数矩阵,mask量化,该函数的作用是进行dct变换,在函数中fimage当做x
	//计算压缩率, 用非零矩阵点数量比总数量、
	fimage.convertTo(image, CV_8UC1);// 转化成1 0矩阵,单位矩阵?
	double dctRate = countNonZero(image) / (256.0 * 256.0);//计算压缩率,非零矩阵的点数比上点数总数量----像素总数量?
	cout << "the size becomes " << dctRate * 100 << "% of the original." << endl; //将压缩率乘以100输出
	imshow("压缩图", fimage);//dct变换后的图片
	//dct反变换
	myiDct(fimage, A, mask);
	//显示还原的图像
	fimage.convertTo(image, CV_8UC1); //将矩阵转化为图片
	imshow("还原图", image);
	waitKey(0);
	return 0;
} 

转自:https://blog.csdn.net/Qer_computerscience/article/details/72786731

 
 
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 : Donate Close

猜你喜欢

转载自blog.csdn.net/zyckhuntoria/article/details/81326723