#include<iostream>
#include<opencv2/opencv.hpp>
#include<time.h>
using namespace std;
using namespace cv;
#define height 8
#define width 8 //定义8*8块的高和宽
#define Q 7 //定义控制量化步长的Q值
//定义亮度区域和色度区域的量化矩阵
int QY[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 }
};
int QC[8][8] = { { 17, 18, 24, 47, 99, 99, 99, 99 },
{ 18, 21, 26, 66, 99, 99, 99, 99 },
{ 24, 26, 56, 99, 99, 99, 99, 99 },
{ 47, 66, 99, 99, 99, 99, 99, 99 },
{ 99, 99, 99, 99, 99, 99, 99, 99 },
{ 99, 99, 99, 99, 99, 99, 99, 99 },
{ 99, 99, 99, 99, 99, 99, 99, 99 },
{ 99, 99, 99, 99, 99, 99, 99, 99 }
};
//定义一个进行Zag-Zig扫描的表
int Zig_8[64] = { 0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, 7, 14, 21, 28,
35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63 };
//定义量化函数
void LH_QY(Mat &srcImage)
{
for (int i = 0; i < srcImage.rows; i++)
for (int j = 0; j < srcImage.cols; j++)
{
srcImage.at<double>(i, j) = round(srcImage.at<double>(i, j) / (QY[i][j]*Q));
}
}
void LH_QC(Mat &srcImage)
{
for (int i = 0; i < srcImage.rows; i++)
for (int j = 0; j < srcImage.cols; j++)
{
srcImage.at<double>(i, j) = round(srcImage.at<double>(i, j) / (QC[i][j]*Q));
}
}
//定义反量化函数
void ILH_QY(Mat &srcImage)
{
for (int i = 0; i < srcImage.rows; i++)
for (int j = 0; j < srcImage.cols; j++)
{
srcImage.at<double>(i, j) = srcImage.at<double>(i, j) * QY[i][j];
}
}
void ILH_QC(Mat &srcImage)
{
for (int i = 0; i < srcImage.rows; i++)
for (int j = 0; j < srcImage.cols; j++)
{
srcImage.at<double>(i, j) = srcImage.at<double>(i, j) * QC[i][j];
}
}
//定义了一个文件存储的函数
void storage_int(Mat mat, char* filename)
{
FILE *fp = fopen(filename, "w");
for (int i = 0; i < mat.rows; i++)
{
for (int j = 0; j < mat.cols; j++)
{
fprintf(fp, "%d", mat.at<uchar>(i, j));
fprintf(fp, "\t");
}
fprintf(fp, "\n");
}
fclose(fp);
}
void storage_float(Mat mat, char* filename)
{
FILE *fp = fopen(filename, "w");
for (int i = 0; i < mat.rows; i++)
{
for (int j = 0; j < mat.cols; j++)
{
fprintf(fp, "%f", mat.at<double>(i, j));
fprintf(fp, "\t");
}
fprintf(fp, "\n");
}
fclose(fp);
}
//存储行程编码的非零数之间的0的个数,非零数
struct Temp_1
{
string number_zero;
string value;
};
//存储0的个数,非零数二进制编码,编码长度
struct Temp_2
{
string number_zero;//0的个数
string code_len;//编码长度
string code;//编码
};
//存储前面(0的个数+编码长度)合并后的结果,非零数编码
struct Temp_3
{
string he_bin;//前面两位合并后的结果
string code;//编码
};
//存储编码后的结果
struct Temp_4
{
string code_1;//哈夫曼编码
string code_2;//二进制编码
};
//声明十进制与二进制对应的表
struct bitTable
{
string value;//需要编码的值
string code;//编码
string len;//编码长度
};
bitTable bit_table[192] = {
{ "0", "-", "0" }, { "1", "1", "1" }, { "-1", "0", "1" }, { "2", "10", "2" }, { "-2", "01", "2" }, { "3", "11", "3" },
{ "-3", "00", "3" }, { "4", "100", "3" }, { "-4", "011", "3" }, { "5", "101", "3" }, { "-5", "010", "3" }, { "6", "110", "3" },
{ "-6", "001", "3" }, { "7", "111", "3" }, { "-7", "000", "3" }, { "8", "1000", "4" }, { "-8", "0111", "4" },
{ "9", "1001", "4" }, { "-9", "0110", "4" }, { "10", "1010", "4" }, { "-10", "0101", "4" }, { "11", "1011", "4" },
{ "-11", "0100", "4" }, { "12", "1100", "4" }, { "-12", "0011", "4" }, { "13", "1101", "4" }, { "-13", "0010", "4" },
{ "14", "1110", "4" }, { "-14", "0001", "4" }, { "15", "1111", "4" }, { "-15", "0000", "4" }, { "16", "10000", "5" },
{ "-16", "01111", "5" }, { "17", "10001", "5" }, { "-17", "01110", "5" }, { "18", "10010", "5" }, { "-18", "01101", "5" },
{ "19", "10011", "5" }, { "-19", "01100", "5" }, { "20", "10100", "5" }, { "-20", "01011", "5" }, { "21", "10101", "5" },
{ "-21", "01010", "5" }, { "22", "10110", "5" }, { "-22", "01001", "5" }, { "23", "10111", "5" }, { "-23", "01000", "5" },
{ "24", "11000", "5" }, { "-24", "00111", "5" }, { "25", "11001", "5" }, { "-25", "00110", "5" }, { "26", "11010", "5" },
{ "-26", "00101", "5" }, { "27", "11011", "5" }, { "-27", "00100", "5" }, { "28", "11100", "5" }, { "-28", "00011", "5" },
{ "29", "11101", "5" }, { "-29", "00010", "5" }, { "30", "11110", "5" }, { "-30", "00001", "5" }, { "31", "11111", "5" },
{ "-31", "00000", "5" }, { "32", "100000", "6" }, { "-32", "011111", "6" }, { "33", "100001", "6" }, { "-33", "011110", "6" },
{ "34", "100010", "6" }, { "-34", "011101", "6" }, { "35", "100011", "6" }, { "-35", "011100", "6" }, { "36", "100100", "6" },
{ "-36", "011011", "6" }, { "37", "100101", "6" }, { "-37", "011010", "6" }, { "38", "100110", "6" }, { "-38", "011001", "6" },
{ "39", "100111", "6" }, { "-39", "011000", "6" }, { "40", "101000", "6" }, { "-40", "010111", "6" }, { "41", "101001", "6" },
{ "-41", "010110", "6" }, { "42", "101010", "6" }, { "-42", "010101", "6" }, { "43", "101011", "6" }, { "-43", "010100", "6" },
{ "44", "101100", "6" }, { "-44", "010011", "6" }, { "45", "101101", "6" }, { "-45", "010010", "6" }, { "46", "101110", "6" },
{ "-46", "010001", "6" }, { "47", "101111", "6" }, { "-47", "010000", "6" }, { "48", "110000", "6" }, { "-48", "001111", "6" },
{ "49", "110001", "6" }, { "-49", "001110", "6" }, { "50", "110010", "6" }, { "-50", "001101", "6" }, { "51", "110011", "6" },
{ "-51", "001100", "6" }, { "52", "110100", "6" }, { "-52", "001011", "6" }, { "53", "110101", "6" }, { "-53", "001010", "6" },
{ "54", "110110", "6" }, { "-54", "001001", "6" }, { "55", "110111", "6" }, { "-55", "001000", "6" }, { "56", "111000", "6" },
{ "-56", "000111", "6" }, { "57", "111001", "6" }, { "-57", "000110", "6" }, { "58", "111010", "6" }, { "-58", "000101", "6" },
{ "59", "111011", "6" }, { "-59", "000100", "6" }, { "60", "111100", "6" }, { "-60", "000011", "6" }, { "61", "111101", "6" },
{ "-61", "000010", "6" }, { "62", "111110", "6" }, { "-62", "000001", "6" }, { "63", "111111", "6" }, { "-63", "000000", "6" },
{ "64", "1000000", "7" }, { "65", "1000001", "7" }, { "66", "1000010", "7" }, { "67", "1000011", "7" }, { "68", "1000100", "7" },
{ "69", "1000101", "7" }, { "70", "1000110", "7" }, { "71", "1000111", "7" }, { "72", "1001000", "7" }, { "73", "1001001", "7" },
{ "74", "1001010", "7" }, { "75", "1001011", "7" }, { "76", "1001100", "7" }, { "77", "1001101", "7" }, { "78", "1001110", "7" },
{ "79", "1001111", "7" }, { "80", "1010000", "7" }, { "81", "1010001", "7" }, { "82", "1010010", "7" }, { "83", "1010011", "7" },
{ "84", "1010100", "7" }, { "85", "1010101", "7" }, { "86", "1010110", "7" }, { "87", "1010111", "7" }, { "88", "1011000", "7" },
{ "89", "1011001", "7" }, { "90", "1011010", "7" }, { "91", "1011011", "7" }, { "92", "1011100", "7" }, { "93", "1011101", "7" },
{ "94", "1011110", "7" }, { "95", "1011111", "7" }, { "96", "1100000", "7" }, { "97", "1100001", "7" }, { "98", "1100010", "7" },
{ "99", "1100011", "7" }, { "100", "1100100", "7" }, { "101", "1100101", "7" }, { "102", "1100110", "7" }, { "103", "1100111", "7" },
{ "104", "1101000", "7" }, { "105", "1101001", "7" }, { "106", "1101010", "7" }, { "107", "1101011", "7" }, { "108", "1101100", "7" },
{ "109", "1101101", "7" }, { "110", "1101110", "7" }, { "111", "1101111", "7" }, { "112", "1110000", "7" }, { "113", "1110001", "7" },
{ "114", "1110010", "7" }, { "115", "1110011", "7" }, { "116", "1110100", "7" }, { "117", "1110101", "7" }, { "118", "1110110", "7" },
{ "119", "1110111", "7" }, { "120", "1111000", "7" }, { "121", "1111001", "7" }, { "122", "1111010"
评论4