#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 += 1)
for (int j = 0; j < 256; j += 1)
{
//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)
{
//X = ATXA
image(Range(i, i + 8), Range(j, j + 8)) = A.t() * image(Range(i, i + 8), Range(j, j + 8)) * A;
//用mask量化
image(Range(i, i + 8), Range(j, j + 8)) /= mask;//用mask对x进行量化
}
}
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] = { { 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 0 }, { 1, 1, 1, 1, 1, 1, 0, 0}, { 1, 1, 1, 1, 1, 0, 0, 0 }, { 1, 1, 1, 1, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0 } };
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);// 转化八位无符号
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);
imshow("还原图", image);
waitKey(0);
return 0;
}
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