#include "stdafx.h" #include "waveDecompose.h" // 一维小波分解 bool dwt(cv::Mat &cA, cv::Mat &cD, // 输出 const cv::Mat &x, const cv::Mat &LF, const cv::Mat &HF) // 输入 { // 输入有效性判断 if (x.empty() == true || (x.type() != CV_64FC1) || x.rows != 1) { return false; } if (LF.empty() == true || LF.type() != CV_64FC1 || HF.empty() == true || HF.type() != CV_64FC1) { return false; } // 只处理行向量 if ( LF.size != HF.size || LF.rows != 1) { return false; } // (1) 低频滤波 // (1.1)卷积结果 cv::Mat cvl; int xCols = x.cols; int LFCols = LF.cols; cvl = cv::Mat(1, xCols + LFCols - 1, x.type()); cvl = cv::Scalar(0.0, 0.0, 0.0); for (int i = 0; i < cvl.cols; i++) { for (int j = 0; j < LFCols; j++) { if ((i - j) >= 0 && (i - j) < xCols) { cvl.at(0, i) += LF.at(0,j) * x.at(0, i - j); } } } // (1.2)下采样 并赋值给cA cA = cv::Mat(1, int(cvl.cols / 2), CV_64FC1); for (int i = 0; i < cA.cols; i++) { cA.at(0, i) = cvl.at(0, 2 * i + 1); } // (2)高频滤波 // (2.1)卷积结果 cv::Mat cvh; /*int */xCols = x.cols; int HFCols = HF.cols; cvh = cv::Mat(1, xCols + HFCols - 1, x.type()); cvh = cv::Scalar(0.0, 0.0, 0.0); for (int i = 0; i < cvh.cols; i++) // cvh 赋值运算 { for (int j = 0; j < HFCols; j++) { if ((i - j) >= 0 && (i - j) < xCols) { cvh.at(0, i) += HF.at(0,j) * x.at(0, i - j); } } } // (2.2)下采样 并赋值给cD cD = cv::Mat(1, int(cvh.cols / 2), CV_64FC1); for (int i = 0; i < cD.cols; i++) { cD.at(0, i) = cvh.at(0, 2 * i + 1); } return true; } // 功能:函数 dwt2() 对输入矩阵 img 进行2维小波分解,输出四个分解系数子矩阵[LL,HL,LH,HH] bool dwt2(cv::Mat &cA, cv::Mat &cV, cv::Mat &cH, cv::Mat &cD, // 输出 const cv::Mat img, const cv::Mat Lo_D, cv::Mat Hi_D) // 输入 { // 输入img有效性判断 if (img.empty() == true || (img.type() != CV_64FC1)) { return false; } // Lo_D Hi_D 校验 if (Lo_D.empty() == true || Lo_D.type() != CV_64FC1 || Hi_D.empty() == true || Hi_D.type() != CV_64FC1 ||Lo_D.size != Hi_D.size || Lo_D.rows != 1) { return false; } // (1) 逐行卷积 int rowLen = 2 * int((img.cols + Lo_D.cols - 1) / 2); // 一行卷积后的长度:由一维小波分解原理决定 cv::Mat imgRowsConv = cv::Mat(img.rows, rowLen, img.type()); // img逐行卷积后的结果 for (int i = 0; i < img.rows; i++) { cv::Mat iRow = img(cv::Range(i, i + 1), cv::Range(0, img.cols)); // 取第i行 // 一行的卷积结果 cv::Mat cA1; cv::Mat cD1; bool ret = dwt(cA1, cD1, // 输出 iRow, Lo_D, Hi_D); // 输入 if (ret == true) { cA1.copyTo(imgRowsConv(cv::Range(i, i + 1), cv::Range(0, imgRowsConv.cols / 2))); cD1.copyTo(imgRowsConv(cv::Range(i, i + 1), cv::Range(imgRowsConv.cols / 2, imgRowsConv.cols))); } else { return false; } } // 在imgRowsConv基础上列卷积 int colLen = 2 * int((img.rows + Lo_D.cols - 1) / 2); cv::Mat imgColsConv(colLen, imgRowsConv.cols, img.type()); // img逐列卷积后的结果,行增多 for (int i = 0; i < imgRowsConv.cols; i++) { cv::Mat iCol = imgRowsConv(cv::Range(0, imgRowsConv.rows), cv::Range(i, i + 1)); // 第i列 cv::transpose(iCol, iCol); cv::Mat cA2, cD2; bool ret = dwt(cA2, cD2, // 输出 iCol, Lo_D, Hi_D); // 输入 if (ret == true) { cv::transpose(cA2, cA2); cv::transpose(cD2, cD2); cA2.copyTo(imgColsConv(cv::Range(0, imgColsConv.rows / 2) ,cv::Range(i, i + 1))); cD2.copyTo(imgColsConv(cv::Range(imgColsConv.rows / 2, imgColsConv.rows), cv::Range(i, i + 1))); } else { return false; } } int rows = imgColsConv.rows; int cols = imgColsConv.cols; // 得到分解子序列矩阵 imgColsConv(cv::Range(0, rows / 2), cv::Range(0, cols / 2)).copyTo(cA); imgColsConv(cv::Range(0, rows / 2), cv::Range(cols / 2, cols)).copyTo(cV); imgColsConv(cv::Range(rows / 2, rows), cv::Range(0, cols / 2)).copyTo(cH); imgColsConv(cv::Range(rows / 2, rows), cv::Range(cols / 2, cols)).copyTo(cD); return true; } // 功能:函数 getWaveDecFilter() 基于小波名称wname计算小波分解滤波器 bool getWaveDecFilter(cv::Mat &Lo_D, cv::Mat &Hi_D, const string wname) { // 空值判断 if (wname == "") { return false; } // 有效值判断 // haar小波 if (wname == "haar") { // 创建Lo_D Lo_D = cv::Mat(1, 2, CV_64FC1); Lo_D.at(0, 0) = 0.7071; Lo_D.at(0, 1) = 0.7071; // 创建Hi_D Hi_D = cv::Mat(1, 2, CV_64FC1); Hi_D.at(0, 0) = -0.7071; Hi_D.at(0, 1) = 0.7071; } // sym小波 else if (wname == "sym1") { // 创建Lo_D Lo_D = cv::Mat(1, 2, CV_64FC1); Lo_D.at(0, 0) = 0.7071; Lo_D.at(0, 1) = 0.7071; // 创建Hi_D Hi_D = cv::Mat(1, 2, CV_64FC1); Hi_D.at(0, 0) = -0.7071; Hi_D.at(0, 1) = 0.7071; } else if (wname == "sym2") { // 创建Lo_D Lo_D = cv::Mat(1, 4, CV_64FC1); Lo_D.at(0, 0) = -0.1294; Lo_D.at(0, 1) = 0.2241; Lo_D.at(0, 2) = 0.8365; Lo_D.at(0, 3) = 0.4830; // 创建Hi_D Hi_D = cv::Mat(1, 4, CV_64FC1); Hi_D.at(0, 0) = -0.4830; Hi_D.at(0, 1) = 0.8365; Hi_D.at(0, 2) = -0.2241; Hi_D.at(0, 3) = -0.1294; } else if (wname == "sym3") { // 创建Lo_D Lo_D = cv::Mat(1, 6, CV_64FC1); Lo_D.at(0, 0) = 0.0352; Lo_D.at(0, 1) = -0.0854; Lo_D.at(0, 2) = -0.1350; Lo_D.at(0, 3) = 0.4599; Lo_D.at(0, 4) = 0.8069; Lo_D.at(0, 5) = 0.3327; // 创建Hi_D Hi_D = cv::Mat(1, 6, CV_64FC1); Hi_D.at(0, 0) = -0.3327; Hi_D.at(0, 1) = 0.8069; Hi_D.at(0, 2) = -0.4599; Hi_D.at(0, 3) = -0.1350; Hi_D.at(0, 4) = 0.0854; Hi_D.at(0, 5) = 0.0352; } else if (wname == "sym4") { // 创建Lo_D Lo_D = cv::Mat(1, 8, CV_64FC1); Lo_D.at(0, 0) = -0.0758; Lo_D.at(0, 1) = -0.0296; Lo_D.at(0, 2) = 0.4976; Lo_D.at(0, 3) = 0.8037; Lo_D.at(0, 4) = 0.2979; Lo_D.at(0, 5) = -0.0992; Lo_D.at(0, 6) = -0.0126; Lo_D.at(0, 7) = 0.0322; // 创建Hi_D Hi_D = cv::Mat(1, 8, CV_64FC1); Hi_D.at(0, 0) = -0.0322; Hi_D.at(0, 1) = -0.0126; Hi_D.at(0, 2) = 0.0992; Hi_D.at(0, 3) = 0.2979; Hi_D.at(0, 4) = -0.8037; Hi_D.at(0, 5) = 0.4976; Hi_D.at(0, 6) = 0.0296; Hi_D.at(0, 7) = -0.0758; } else if (wname == "sym5") { // 创建Lo_D Lo_D = cv::Mat(1, 10, CV_64FC1); Lo_D.at(0, 0) = 0.0273; Lo_D.at(0, 1) = 0.0295; Lo_D.at(0, 2) = -0.0391; Lo_D.at(0, 3) = 0.1994 ; Lo_D.at(0, 4) = 0.7234 ; Lo_D.at(0, 5) = 0.6340 ; Lo_D.at(0, 6) = 0.0166 ; Lo_D.at(0, 7) = -0.1753; Lo_D.at(0, 8) = -0.0211; Lo_D.at(0, 9) = 0.0195; // 创建Hi_D Hi_D = cv::Mat(1, 10, CV_64FC1); Hi_D.at(0, 0) = -0.0195; Hi_D.at(0, 1) = -0.0211; Hi_D.at(0, 2) = 0.1753 ; Hi_D.at(0, 3) = 0.0166 ; Hi_D.at(0, 4) = -0.6340; Hi_D.at(0, 5) = 0.7234 ; Hi_D.at(0, 6) = -0.1994; Hi_D.at(0, 7) = -0.0391; Hi_D.at(0, 8) = -0.0295; Hi_D.at(0, 9) = 0.0273; } else if (wname == "sym6") { // 创建Lo_D Lo_D = cv::Mat(1, 12, CV_64FC1); Lo_D.at(0, 0) = 0.0154; Lo_D.at(0, 1) = 0.0035 ; Lo_D.at(0, 2) = -0.1180; Lo_D.at(0, 3) = -0.0483; Lo_D.at(0, 4) = 0.4911 ; Lo_D.at(0, 5) = 0.7876 ; Lo_D.at(0, 6) = 0.3379 ; Lo_D.at(0, 7) = -0.0726; Lo_D.at(0, 8) = -0.0211; Lo_D.at(0, 9) = 0.0447 ; Lo_D.at(0, 10) = 0.0018 ; Lo_D.at(0, 11) = -0.0078; // 创建Hi_D Hi_D = cv::Mat(1, 12, CV_64FC1); Hi_D.at(0, 0) = 0.0078 ; Hi_D.at(0, 1) = 0.0018 ; Hi_D.at(0, 2) = -0.0447; Hi_D.at(0, 3) = -0.0211; Hi_D.at(0, 4) = 0.0726 ; Hi_D.at(0, 5) = 0.3379 ; Hi_D.at(0, 6) = -0.7876; Hi_D.at(0, 7) = 0.4911; Hi_D.at(0, 8) = 0.0483 ; Hi_D.at(0, 9) = -0.1180; Hi_D.at(0, 10) = -0.0035 ; Hi_D.at(0, 11) = 0.0154; } else if (wname == "sym7") { // 创建Lo_D Lo_D = cv::Mat(1, 14, CV_64FC1); Lo_D.at(0, 0) = 0.0027 ; Lo_D.at(0, 1) = -0.0010; Lo_D.at(0, 2) = -0.0126; Lo_D.at(0, 3) = 0.0305 ; Lo_D.at(0, 4) = 0.0679 ; Lo_D.at(0, 5) = -0.0496; Lo_D.at(0, 6) = 0.0174 ; Lo_D.at(0, 7) = 0.5361; Lo_D.at(0, 8) = 0.7678 ; Lo_D.at(0, 9) = 0.2886 ; Lo_D.at(0, 10) = -0.1400; Lo_D.at(0, 11) = -0.1078; Lo_D.at(0, 12) = 0.0040 ; Lo_D.at(0, 13) = 0.0103; // 创建Hi_D Hi_D = cv::Mat(1, 14, CV_64FC1); Hi_D.at(0, 0) = -0.0103; Hi_D.at(0, 1) = 0.0040 ; Hi_D.at(0, 2) = 0.1078 ; Hi_D.at(0, 3) = -0.1400; Hi_D.at(0, 4) = -0.2886; Hi_D.at(0, 5) = 0.7678 ; Hi_D.at(0, 6) = -0.5361; Hi_D.at(0, 7) = 0.0174; Hi_D.at(0, 8) = 0.0496 ; Hi_D.at(0, 9) = 0.0679 ; Hi_D.at(0, 10) = -0.0305; Hi_D.at(0, 11) = -0.0126; Hi_D.at(0, 12) = 0.0010 ; Hi_D.at(0, 13) = 0.0027; } else if (wname == "sym8") { // 创建Lo_D Lo_D = cv::Mat(1, 16, CV_64FC1); Lo_D.at(0, 0) = -0.0034; Lo_D.at(0, 1) = -0.0005; Lo_D.at(0, 2) = 0.0317 ; Lo_D.at(0, 3) = 0.0076 ; Lo_D.at(0, 4) = -0.1433; Lo_D.at(0, 5) = -0.0613; Lo_D.at(0, 6) = 0.4814 ; Lo_D.at(0, 7) = 0.7772 ; Lo_D.at(0, 8) = 0.3644; Lo_D.at(0, 9) = -0.0519; Lo_D.at(0, 10) = -0.0272; Lo_D.at(0, 11) = 0.0491 ; Lo_D.at(0, 12) = 0.0038 ; Lo_D.at(0, 13) = -0.0150; Lo_D.at(0, 14) = -0.0003; Lo_D.at(0, 15) = 0.0019 ; // 创建Hi_D Hi_D = cv::Mat(1, 16, CV_64FC1); Hi_D.at(0, 0) = -0.0019; Hi_D.at(0, 1) = -0.0003; Hi_D.at(0, 2) = 0.0150 ; Hi_D.at(0, 3) = 0.0038 ; Hi_D.at(0, 4) = -0.0491; Hi_D.at(0, 5) = -0.0272; Hi_D.at(0, 6) = 0.0519 ; Hi_D.at(0, 7) = 0.3644 ; Hi_D.at(0, 8) = -0.7772; Hi_D.at(0, 9) = 0.4814; Hi_D.at(0, 10) = 0.0613 ; Hi_D.at(0, 11) = -0.1433; Hi_D.at(0, 12) = -0.0076; Hi_D.at(0, 13) = 0.0317 ; Hi_D.at(0, 14) = 0.0005 ; Hi_D.at(0, 15) = -0.0034; } else if (wname == "sym9") { // 创建Lo_D Lo_D = cv::Mat(1, 18, CV_64FC1); Lo_D.at(0, 0) = 0.0014 ; Lo_D.at(0, 1) = 0.0006 ; Lo_D.at(0, 2) = -0.0133; Lo_D.at(0, 3) = -0.0115; Lo_D.at(0, 4) = 0.0302 ; Lo_D.at(0, 5) = 0.0006 ; Lo_D.at(0, 6) = -0.0546; Lo_D.at(0, 7) = 0.2388 ; Lo_D.at(0, 8) = 0.7179 ; Lo_D.at(0, 9) = 0.6173; Lo_D.at(0, 10) = 0.0353 ; Lo_D.at(0, 11) = -0.1916; Lo_D.at(0, 12) = -0.0182; Lo_D.at(0, 13) = 0.0621 ; Lo_D.at(0, 14) = 0.0089 ; Lo_D.at(0, 15) = -0.0103; Lo_D.at(0, 16) = -0.0005; Lo_D.at(0, 17) = 0.0011; // 创建Hi_D Hi_D = cv::Mat(1, 18, CV_64FC1); Hi_D.at(0, 0) = -0.0011; Hi_D.at(0, 1) = -0.0005; Hi_D.at(0, 2) = 0.0103 ; Hi_D.at(0, 3) = 0.0089 ; Hi_D.at(0, 4) = -0.0621; Hi_D.at(0, 5) = -0.0182; Hi_D.at(0, 6) = 0.1916 ; Hi_D.at(0, 7) = 0.0353 ; Hi_D.at(0, 8) = -0.6173; Hi_D.at(0, 9) = 0.7179; Hi_D.at(0, 10) = -0.2388; Hi_D.at(0, 11) = -0.0546; Hi_D.at(0, 12) = -0.0006; Hi_D.at(0, 13) = 0.0302 ; Hi_D.at(0, 14) = 0.0115 ; Hi_D.at(0, 15) = -0.0133; Hi_D.at(0, 16) = -0.0006; Hi_D.at(0, 17) = 0.0014; } else if (wname == "sym10") { // 创建Lo_D Lo_D = cv::Mat(1, 20, CV_64FC1); Lo_D.at(0, 0) = 0.0008 ; Lo_D.at(0, 1) = 0.0001 ; Lo_D.at(0, 2) = -0.0086; Lo_D.at(0, 3) = -0.0015; Lo_D.at(0, 4) = 0.0459 ; Lo_D.at(0, 5) = 0.0116 ; Lo_D.at(0, 6) = -0.1595; Lo_D.at(0, 7) = -0.0709; Lo_D.at(0, 8) = 0.4717 ; Lo_D.at(0, 9) = 0.7695; Lo_D.at(0, 10) = 0.3838 ; Lo_D.at(0, 11) = -0.0355; Lo_D.at(0, 12) = -0.0320; Lo_D.at(0, 13) = 0.0500 ; Lo_D.at(0, 14) = 0.0058 ; Lo_D.at(0, 15) = -0.0204; Lo_D.at(0, 16) = -0.0008; Lo_D.at(0, 17) = 0.0046 ; Lo_D.at(0, 18) = 0.0001 ; Lo_D.at(0, 19) = -0.0005; // 创建Hi_D Hi_D = cv::Mat(1, 20, CV_64FC1); Hi_D.at(0, 0) = 0.0005 ; Hi_D.at(0, 1) = 0.0001 ; Hi_D.at(0, 2) = -0.0046; Hi_D.at(0, 3) = -0.0008; Hi_D.at(0, 4) = 0.0204 ; Hi_D.at(0, 5) = 0.0058 ; Hi_D.at(0, 6) = -0.0500; Hi_D.at(0, 7) = -0.0320; Hi_D.at(0, 8) = 0.0355 ; Hi_D.at(0, 9) = 0.3838; Hi_D.at(0, 10) = -0.7695; Hi_D.at(0, 11) = 0.4717 ; Hi_D.at(0, 12) = 0.0709 ; Hi_D.at(0, 13) = -0.1595; Hi_D.at(0, 14) = -0.0116; Hi_D.at(0, 15) = 0.0459 ; Hi_D.at(0, 16) = 0.0015 ; Hi_D.at(0, 17) = -0.0086; Hi_D.at(0, 18) = -0.0001; Hi_D.at(0, 19) = 0.0008; } // dbN 小波 else if (wname == "db1") { // 创建Lo_D Lo_D = cv::Mat(1, 2, CV_64FC1); Lo_D.at(0, 0) = 0.7071; Lo_D.at(0, 1) = 0.7071; // 创建Hi_D Hi_D = cv::Mat(1, 2, CV_64FC1); Hi_D.at(0, 0) = -0.7071; Hi_D.at(0, 1) = 0.7071; } else if (wname == "db2") { // 创建Lo_D Lo_D = cv::Mat(1, 4, CV_64FC1); Lo_D.at(0, 0) = -0.1294; Lo_D.at(0, 1) = 0.2241; Lo_D.at(0, 2) = 0.8365; Lo_D.at(0, 3) = 0.4830; // 创建Hi_D Hi_D = cv::Mat(1, 4, CV_64FC1); Hi_D.at(0, 0) = -0.4830; Hi_D.at(0, 1) = 0.8365; Hi_D.at(0, 2) = -0.2241; Hi_D.at(0, 3) = -0.1294; } else if (wname == "db3") { // 创建Lo_D Lo_D = cv::Mat(1, 6, CV_64FC1); Lo_D.at(0, 0) = 0.0352; Lo_D.at(0, 1) = -0.0854; Lo_D.at(0, 2) = -0.1350; Lo_D.at(0, 3) = 0.4599; Lo_D.at(0, 4) = 0.8069; Lo_D.at(0, 5) = 0.3327; // 创建Hi_D Hi_D = cv::Mat(1, 6, CV_64FC1); Hi_D.at(0, 0) = -0.3327; Hi_D.at(0, 1) = 0.8069; Hi_D.at(0, 2) = -0.4599; Hi_D.at(0, 3) = -0.1350; Hi_D.at(0, 4) = 0.0854; Hi_D.at(0, 5) = 0.0352; } else if (wname == "db4") { // 创建Lo_D Lo_D = cv::Mat(1, 8, CV_64FC1); Lo_D.at(0, 0) = -0.0106; Lo_D.at(0, 1) = 0.0329 ; Lo_D.at(0, 2) = 0.0308 ; Lo_D.at(0, 3) = -0.1870; Lo_D.at(0, 4) = -0.0280; Lo_D.at(0, 5) = 0.6309 ; Lo_D.at(0, 6) = 0.7148 ; Lo_D.at(0, 7) = 0.2304 ; // 创建Hi_D Hi_D = cv::Mat(1, 8, CV_64FC1); Hi_D.at(0, 0) = -0.2304; Hi_D.at(0, 1) = 0.7148 ; Hi_D.at(0, 2) = -0.6309; Hi_D.at(0, 3) = -0.0280; Hi_D.at(0, 4) = 0.1870 ; Hi_D.at(0, 5) = 0.0308 ; Hi_D.at(0, 6) = -0.0329; Hi_D.at(0, 7) = -0.0106; } else if (wname == "db5") { // 创建Lo_D Lo_D = cv::Mat(1, 10, CV_64FC1); Lo_D.at(0, 0) = 0.0033 ; Lo_D.at(0, 1) = -0.0126; Lo_D.at(0, 2) = -0.0062; Lo_D.at(0, 3) = 0.0776 ; Lo_D.at(0, 4) = -0.0322; Lo_D.at(0, 5) = -0.2423; Lo_D.at(0, 6) = 0.1384 ; Lo_D.at(0, 7) = 0.7243 ; Lo_D.at(0, 8) = 0.6038 ; Lo_D.at(0, 9) = 0.1601; // 创建Hi_D Hi_D = cv::Mat(1, 10, CV_64FC1); Hi_D.at(0, 0) = -0.1601; Hi_D.at(0, 1) = 0.6038 ; Hi_D.at(0, 2) = -0.7243; Hi_D.at(0, 3) = 0.1384 ; Hi_D.at(0, 4) = 0.2423 ; Hi_D.at(0, 5) = -0.0322; Hi_D.at(0, 6) = -0.0776; Hi_D.at(0, 7) = -0.0062; Hi_D.at(0, 8) = 0.0126 ; Hi_D.at(0, 9) = 0.0033; } else if (wname == "db6") { // 创建Lo_D Lo_D = cv::Mat(1, 12, CV_64FC1); Lo_D.at(0, 0) = -0.0011; Lo_D.at(0, 1) = 0.0048 ; Lo_D.at(0, 2) = 0.0006 ; Lo_D.at(0, 3) = -0.0316; Lo_D.at(0, 4) = 0.0275 ; Lo_D.at(0, 5) = 0.0975 ; Lo_D.at(0, 6) = -0.1298; Lo_D.at(0, 7) = -0.2263; Lo_D.at(0, 8) = 0.3153 ; Lo_D.at(0, 9) = 0.7511; Lo_D.at(0, 10) = 0.4946; Lo_D.at(0, 11) = 0.1115; // 创建Hi_D Hi_D = cv::Mat(1, 12, CV_64FC1); Hi_D.at(0, 0) = -0.1115; Hi_D.at(0, 1) = 0.4946 ; Hi_D.at(0, 2) = -0.7511; Hi_D.at(0, 3) = 0.3153 ; Hi_D.at(0, 4) = 0.2263 ; Hi_D.at(0, 5) = -0.1298; Hi_D.at(0, 6) = -0.0975; Hi_D.at(0, 7) = 0.0275 ; Hi_D.at(0, 8) = 0.0316 ; Hi_D.at(0, 9) = 0.0006 ; Hi_D.at(0, 10) = -0.0048; Hi_D.at(0, 11) = -0.0011; } else if (wname == "db7") { // 创建Lo_D Lo_D = cv::Mat(1, 14, CV_64FC1); Lo_D.at(0, 0) = 0.0004 ; Lo_D.at(0, 1) = -0.0018; Lo_D.at(0, 2) = 0.0004 ; Lo_D.at(0, 3) = 0.0126 ; Lo_D.at(0, 4) = -0.0166; Lo_D.at(0, 5) = -0.0380; Lo_D.at(0, 6) = 0.0806 ; Lo_D.at(0, 7) = 0.0713 ; Lo_D.at(0, 8) = -0.2240; Lo_D.at(0, 9) = -0.1439; Lo_D.at(0, 10) = 0.4698; Lo_D.at(0, 11) = 0.7291; Lo_D.at(0, 12) = 0.3965; Lo_D.at(0, 13) = 0.0779; // 创建Hi_D Hi_D = cv::Mat(1, 14, CV_64FC1); Hi_D.at(0, 0) = -0.0779; Hi_D.at(0, 1) = 0.3965 ; Hi_D.at(0, 2) = -0.7291; Hi_D.at(0, 3) = 0.4698 ; Hi_D.at(0, 4) = 0.1439 ; Hi_D.at(0, 5) = -0.2240; Hi_D.at(0, 6) = -0.0713; Hi_D.at(0, 7) = 0.0806 ; Hi_D.at(0, 8) = 0.0380 ; Hi_D.at(0, 9) = -0.0166; Hi_D.at(0, 10) = -0.0126; Hi_D.at(0, 11) = 0.0004 ; Hi_D.at(0, 12) = 0.0018 ; Hi_D.at(0, 13) = 0.0004 ; } else if (wname == "db8") { // 创建Lo_D Lo_D = cv::Mat(1, 16, CV_64FC1); Lo_D.at(0, 0) = -0.0001; Lo_D.at(0, 1) = 0.0007 ; Lo_D.at(0, 2) = -0.0004; Lo_D.at(0, 3) = -0.0049; Lo_D.at(0, 4) = 0.0087 ; Lo_D.at(0, 5) = 0.0140 ; Lo_D.at(0, 6) = -0.0441; Lo_D.at(0, 7) = -0.0174; Lo_D.at(0, 8) = 0.1287 ; Lo_D.at(0, 9) = 0.0005; Lo_D.at(0, 10) = -0.2840; Lo_D.at(0, 11) = -0.0158; Lo_D.at(0, 12) = 0.5854 ; Lo_D.at(0, 13) = 0.6756 ; Lo_D.at(0, 14) = 0.3129 ; Lo_D.at(0, 15) = 0.0544; // 创建Hi_D Hi_D = cv::Mat(1, 16, CV_64FC1); Hi_D.at(0, 0) = -0.0544; Hi_D.at(0, 1) = 0.3129 ; Hi_D.at(0, 2) = -0.6756; Hi_D.at(0, 3) = 0.5854 ; Hi_D.at(0, 4) = 0.0158 ; Hi_D.at(0, 5) = -0.2840; Hi_D.at(0, 6) = -0.0005; Hi_D.at(0, 7) = 0.1287 ; Hi_D.at(0, 8) = 0.0174 ; Hi_D.at(0, 9) = -0.0441; Hi_D.at(0, 10) = -0.0140; Hi_D.at(0, 11) = 0.0087 ; Hi_D.at(0, 12) = 0.0049 ; Hi_D.at(0, 13) = -0.0004; Hi_D.at(0, 14) = -0.0007; Hi_D.at(0, 15) = -0.0001; } else if (wname == "db9") { // 创建Lo_D Lo_D = cv::Mat(1, 18, CV_64FC1); Lo_D.at(0, 0) = 0.0000 ; Lo_D.at(0, 1) = -0.0003; Lo_D.at(0, 2) = 0.0002 ; Lo_D.at(0, 3) = 0.0018 ; Lo_D.at(0, 4) = -0.0043; Lo_D.at(0, 5) = -0.0047; Lo_D.at(0, 6) = 0.0224 ; Lo_D.at(0, 7) = 0.0003 ; Lo_D.at(0, 8) = -0.0676; Lo_D.at(0, 9) = 0.0307; Lo_D.at(0, 10) = 0.1485 ; Lo_D.at(0, 11) = -0.0968; Lo_D.at(0, 12) = -0.2933; Lo_D.at(0, 13) = 0.1332 ; Lo_D.at(0, 14) = 0.6573 ; Lo_D.at(0, 15) = 0.6048 ; Lo_D.at(0, 16) = 0.2438 ; Lo_D.at(0, 17) = 0.0381; // 创建Hi_D Hi_D = cv::Mat(1, 18, CV_64FC1); Hi_D.at(0, 0) = -0.0381; Hi_D.at(0, 1) = 0.2438 ; Hi_D.at(0, 2) = -0.6048; Hi_D.at(0, 3) = 0.6573 ; Hi_D.at(0, 4) = -0.1332; Hi_D.at(0, 5) = -0.2933; Hi_D.at(0, 6) = 0.0968 ; Hi_D.at(0, 7) = 0.1485 ; Hi_D.at(0, 8) = -0.0307; Hi_D.at(0, 9) = -0.0676; Hi_D.at(0, 10) = -0.0003; Hi_D.at(0, 11) = 0.0224 ; Hi_D.at(0, 12) = 0.0047 ; Hi_D.at(0, 13) = -0.0043; Hi_D.at(0, 14) = -0.0018; Hi_D.at(0, 15) = 0.0002 ; Hi_D.at(0, 16) = 0.0003 ; Hi_D.at(0, 17) = 0.0000; } else if (wname == "db10") { // 创建Lo_D Lo_D = cv::Mat(1, 20, CV_64FC1); Lo_D.at(0, 0) = -0.0000; Lo_D.at(0, 1) = 0.0001 ; Lo_D.at(0, 2) = -0.0001; Lo_D.at(0, 3) = -0.0007; Lo_D.at(0, 4) = 0.0020 ; Lo_D.at(0, 5) = 0.0014 ; Lo_D.at(0, 6) = -0.0107; Lo_D.at(0, 7) = 0.0036 ; Lo_D.at(0, 8) = 0.0332 ; Lo_D.at(0, 9) = -0.0295; Lo_D.at(0, 10) = -0.0714; Lo_D.at(0, 11) = 0.0931 ; Lo_D.at(0, 12) = 0.1274 ; Lo_D.at(0, 13) = -0.1959; Lo_D.at(0, 14) = -0.2498; Lo_D.at(0, 15) = 0.2812 ; Lo_D.at(0, 16) = 0.6885 ; Lo_D.at(0, 17) = 0.5272 ; Lo_D.at(0, 18) = 0.1882 ; Lo_D.at(0, 19) = 0.0267; // 创建Hi_D Hi_D = cv::Mat(1, 20, CV_64FC1); Hi_D.at(0, 0) = -0.0267; Hi_D.at(0, 1) = 0.1882 ; Hi_D.at(0, 2) = -0.5272; Hi_D.at(0, 3) = 0.6885 ; Hi_D.at(0, 4) = -0.2812; Hi_D.at(0, 5) = -0.2498; Hi_D.at(0, 6) = 0.1959 ; Hi_D.at(0, 7) = 0.1274 ; Hi_D.at(0, 8) = -0.0931; Hi_D.at(0, 9) = -0.0714; Hi_D.at(0, 10) = 0.0295 ; Hi_D.at(0, 11) = 0.0332 ; Hi_D.at(0, 12) = -0.0036; Hi_D.at(0, 13) = -0.0107; Hi_D.at(0, 14) = -0.0014; Hi_D.at(0, 15) = 0.0020 ; Hi_D.at(0, 16) = 0.0007 ; Hi_D.at(0, 17) = -0.0001; Hi_D.at(0, 18) = -0.0001; Hi_D.at(0, 19) = -0.0000; } // coiflet小波 else if (wname == "coif1") { // 创建Lo_D Lo_D = cv::Mat(1, 6, CV_64FC1); Lo_D.at(0, 0) = -0.0157; Lo_D.at(0, 1) = -0.0727; Lo_D.at(0, 2) = 0.3849; Lo_D.at(0, 3) = 0.8526; Lo_D.at(0, 4) = 0.3379; Lo_D.at(0, 5) = -0.0727; // 创建Hi_D Hi_D = cv::Mat(1, 6, CV_64FC1); Hi_D.at(0, 0) = 0.0727; Hi_D.at(0, 1) = 0.3379; Hi_D.at(0, 2) = -0.8526; Hi_D.at(0, 3) = 0.3849; Hi_D.at(0, 4) = 0.0727; Hi_D.at(0, 5) = -0.0157; } else if (wname == "coif2") { // 创建Lo_D Lo_D = cv::Mat(1, 12, CV_64FC1); Lo_D.at(0, 0) = -0.0007; Lo_D.at(0, 1) = -0.0018; Lo_D.at(0, 2) = 0.0056 ; Lo_D.at(0, 3) = 0.0237 ; Lo_D.at(0, 4) = -0.0594; Lo_D.at(0, 5) = -0.0765; Lo_D.at(0, 6) = 0.4170 ; Lo_D.at(0, 7) = 0.8127 ; Lo_D.at(0, 8) = 0.3861 ; Lo_D.at(0, 9) = -0.0674; Lo_D.at(0, 10) = -0.0415; Lo_D.at(0, 11) = 0.0164; // 创建Hi_D Hi_D = cv::Mat(1, 12, CV_64FC1); Hi_D.at(0, 0) = -0.0164; Hi_D.at(0, 1) = -0.0415; Hi_D.at(0, 2) = 0.0674 ; Hi_D.at(0, 3) = 0.3861 ; Hi_D.at(0, 4) = -0.8127; Hi_D.at(0, 5) = 0.4170 ; Hi_D.at(0, 6) = 0.0765 ; Hi_D.at(0, 7) = -0.0594; Hi_D.at(0, 8) = -0.0237; Hi_D.at(0, 9) = 0.0056; Hi_D.at(0, 10) = 0.0018 ; Hi_D.at(0, 11) = -0.0007; } else if (wname == "coif3") { // 创建Lo_D Lo_D = cv::Mat(1, 18, CV_64FC1); Lo_D.at(0, 0) = -0.0000; Lo_D.at(0, 1) = -0.0001; Lo_D.at(0, 2) = 0.0005 ; Lo_D.at(0, 3) = 0.0011 ; Lo_D.at(0, 4) = -0.0026; Lo_D.at(0, 5) = -0.0090; Lo_D.at(0, 6) = 0.0159 ; Lo_D.at(0, 7) = 0.0346 ; Lo_D.at(0, 8) = -0.0823; Lo_D.at(0, 9) = -0.0718; Lo_D.at(0, 10) = 0.4285 ; Lo_D.at(0, 11) = 0.7938 ; Lo_D.at(0, 12) = 0.4052 ; Lo_D.at(0, 13) = -0.0611; Lo_D.at(0, 14) = -0.0658; Lo_D.at(0, 15) = 0.0235 ; Lo_D.at(0, 16) = 0.0078 ; Lo_D.at(0, 17) = -0.0038; // 创建Hi_D Hi_D = cv::Mat(1, 18, CV_64FC1); Hi_D.at(0, 0) = 0.0038 ; Hi_D.at(0, 1) = 0.0078 ; Hi_D.at(0, 2) = -0.0235; Hi_D.at(0, 3) = -0.0658; Hi_D.at(0, 4) = 0.0611 ; Hi_D.at(0, 5) = 0.4052 ; Hi_D.at(0, 6) = -0.7938; Hi_D.at(0, 7) = 0.4285 ; Hi_D.at(0, 8) = 0.0718 ; Hi_D.at(0, 9) = -0.0823; Hi_D.at(0, 10) = -0.0346; Hi_D.at(0, 11) = 0.0159 ; Hi_D.at(0, 12) = 0.0090 ; Hi_D.at(0, 13) = -0.0026; Hi_D.at(0, 14) = -0.0011; Hi_D.at(0, 15) = 0.0005 ; Hi_D.at(0, 16) = 0.0001 ; Hi_D.at(0, 17) = -0.0000; } else if (wname == "coif4") { // 创建Lo_D Lo_D = cv::Mat(1, 24, CV_64FC1); Lo_D.at(0, 0) = -0.0000; Lo_D.at(0, 1) = -0.0000; Lo_D.at(0, 2) = 0.0000 ; Lo_D.at(0, 3) = 0.0001 ; Lo_D.at(0, 4) = -0.0003; Lo_D.at(0, 5) = -0.0006; Lo_D.at(0, 6) = 0.0013 ; Lo_D.at(0, 7) = 0.0038 ; Lo_D.at(0, 8) = -0.0057; Lo_D.at(0, 9) = -0.0152; Lo_D.at(0, 10) = 0.0251 ; Lo_D.at(0, 11) = 0.0393 ; Lo_D.at(0, 12) = -0.0962; Lo_D.at(0, 13) = -0.0666; Lo_D.at(0, 14) = 0.4344 ; Lo_D.at(0, 15) = 0.7822 ; Lo_D.at(0, 16) = 0.4153 ; Lo_D.at(0, 17) = -0.0561; Lo_D.at(0, 18) = -0.0813; Lo_D.at(0, 19) = 0.0267 ; Lo_D.at(0, 20) = 0.0161 ; Lo_D.at(0, 21) = -0.0073; Lo_D.at(0, 22) = -0.0016; Lo_D.at(0, 23) = 0.0009; // 创建Hi_D Hi_D = cv::Mat(1, 24, CV_64FC1); Hi_D.at(0, 0) = -0.0009; Hi_D.at(0, 1) = -0.0016; Hi_D.at(0, 2) = 0.0073 ; Hi_D.at(0, 3) = 0.0161 ; Hi_D.at(0, 4) = -0.0267; Hi_D.at(0, 5) = -0.0813; Hi_D.at(0, 6) = 0.0561 ; Hi_D.at(0, 7) = 0.4153 ; Hi_D.at(0, 8) = -0.7822; Hi_D.at(0, 9) = 0.4344; Hi_D.at(0, 10) = 0.0666 ; Hi_D.at(0, 11) = -0.0962; Hi_D.at(0, 12) = -0.0393; Hi_D.at(0, 13) = 0.0251 ; Hi_D.at(0, 14) = 0.0152 ; Hi_D.at(0, 15) = -0.0057; Hi_D.at(0, 16) = -0.0038; Hi_D.at(0, 17) = 0.0013 ; Hi_D.at(0, 18) = 0.0006 ; Hi_D.at(0, 19) = -0.0003; Hi_D.at(0, 20) = -0.0001; Hi_D.at(0, 21) = 0.0000 ; Hi_D.at(0, 22) = 0.0000 ; Hi_D.at(0, 23) = -0.0000; } else if (wname == "coif5") { // 创建Lo_D Lo_D = cv::Mat(1, 30, CV_64FC1); Lo_D.at(0, 0) = -0.0000; Lo_D.at(0, 1) = -0.0000; Lo_D.at(0, 2) = 0.0000 ; Lo_D.at(0, 3) = 0.0000 ; Lo_D.at(0, 4) = -0.0000; Lo_D.at(0, 5) = -0.0000; Lo_D.at(0, 6) = 0.0001 ; Lo_D.at(0, 7) = 0.0003 ; Lo_D.at(0, 8) = -0.0006; Lo_D.at(0, 9) = -0.0017; Lo_D.at(0, 10) = 0.0024; Lo_D.at(0, 11) = 0.0068 ; Lo_D.at(0, 12) = -0.0092; Lo_D.at(0, 13) = -0.0198; Lo_D.at(0, 14) = 0.0327 ; Lo_D.at(0, 15) = 0.0413 ; Lo_D.at(0, 16) = -0.1056; Lo_D.at(0, 17) = -0.0620; Lo_D.at(0, 18) = 0.4380 ; Lo_D.at(0, 19) = 0.7743; Lo_D.at(0, 20) = 0.4216 ; Lo_D.at(0, 21) = -0.0520; Lo_D.at(0, 22) = -0.0919; Lo_D.at(0, 23) = 0.0282 ; Lo_D.at(0, 24) = 0.0234; Lo_D.at(0, 25) = -0.0101; Lo_D.at(0, 26) = -0.0042; Lo_D.at(0, 27) = 0.0022 ; Lo_D.at(0, 28) = 0.0004 ; Lo_D.at(0, 29) = -0.0002; // 创建Hi_D Hi_D = cv::Mat(1, 30, CV_64FC1); Hi_D.at(0, 0) = 0.0002 ; Hi_D.at(0, 1) = 0.0004 ; Hi_D.at(0, 2) = -0.0022; Hi_D.at(0, 3) = -0.0042; Hi_D.at(0, 4) = 0.0101 ; Hi_D.at(0, 5) = 0.0234 ; Hi_D.at(0, 6) = -0.0282; Hi_D.at(0, 7) = -0.0919; Hi_D.at(0, 8) = 0.0520 ; Hi_D.at(0, 9) = 0.4216 ; Hi_D.at(0, 10) = -0.7743; Hi_D.at(0, 11) = 0.4380 ; Hi_D.at(0, 12) = 0.0620 ; Hi_D.at(0, 13) = -0.1056; Hi_D.at(0, 14) = -0.0413; Hi_D.at(0, 15) = 0.0327 ; Hi_D.at(0, 16) = 0.0198 ; Hi_D.at(0, 17) = -0.0092; Hi_D.at(0, 18) = -0.0068; Hi_D.at(0, 19) = 0.0024; Hi_D.at(0, 20) = 0.0017 ; Hi_D.at(0, 21) = -0.0006; Hi_D.at(0, 22) = -0.0003; Hi_D.at(0, 23) = 0.0001 ; Hi_D.at(0, 24) = -0.0000; Hi_D.at(0, 25) = -0.0000; Hi_D.at(0, 26) = -0.0000; Hi_D.at(0, 27) = -0.0000; Hi_D.at(0, 28) = -0.0000; Hi_D.at(0, 29) = -0.0000; } else { return false; } return true; } // 功能:函数 waveDec2() 对输入矩阵 img 进行 level 层分解,得到相应的分解系数 bool waveDec2(std::deque &coef, std::deque &scf, const cv::Mat img, const string wname, const unsigned int level) { // 输入有效性判断 if (img.empty() == true || (img.type() != CV_8UC1) // 图像类型与空值判断 || level < 1 ) { return false; } // 创建小波函数的滤波器组系数向量 cv::Mat Lo_D; // 低频滤波器 cv::Mat Hi_D; // 高频滤波器 if (!getWaveDecFilter(Lo_D, Hi_D, wname)) { return false; } // 滤波器创建结果判断 if (Lo_D.empty() == true || Hi_D.empty() == true || Lo_D.size != Hi_D.size) { return false; } // 为保证计算精度, 创建double类型图像 cv::Mat img_d; img.convertTo(img_d, CV_64FC1); // 转换判断 if (img_d.empty() == true) { return false; } // 输出清理 coef.clear(); scf.clear(); // 小波分解 cv::Mat cA; // 低频部分分解系数 cv::Mat cV; // 垂直方向分解系数 cv::Mat cH; // 水平方向分解系数 cv::Mat cD; // 对角线方向分解系数 // 向scf赋值 原图像尺寸 cv::Vec2i vec; vec[0] = img_d.rows; vec[1] = img_d.cols; scf.push_front(vec); for (unsigned int i = 0; i < level; i++) { bool ret = dwt2(cA, cV, cH, cD, // 输出 img_d, Lo_D, Hi_D); // 输入 if (ret == false) { return false; } else { cA.copyTo(img_d); // 更新低频分量img_d // 向scf赋值 cA(cV, cH, cD)尺寸 vec[0] = img_d.rows; vec[1] = img_d.cols; scf.push_front(vec); // 向coef中存储:cV, cH, cD coef.push_front(cD); coef.push_front(cH); coef.push_front(cV); } } // 向scf赋值 cA 尺寸 vec[0] = img_d.rows; vec[1] = img_d.cols; scf.push_front(vec); // 将cA赋值给coef coef.push_front(cA); return true; }