影象處理 二維小波變換
程式設計環境:windows下結合opencv庫
//二維影象小波變換
/*
nLayer:變換尺度
type:小波型別
*/
void ImageDWT(IplImage* src, IplImage* dst, int nLayer, char* type);
//通用的二維小波變換
/*
nLayer:小波變換的層數
type:選取的小波名稱
可用為: "haar","db4","sym4"
使用Mallat演算法,並利用傅立葉變換來快速執行卷積運算
src與dst深度均為IPL_DEPTH_8U
*/
void ImageDWT(IplImage* src, IplImage* dst, int nLayer, char* type)
{
if (!src || !dst)
{
return;
}
//判斷src與dst的長度寬度是否為2的倍數
if (((dst->width >> nLayer) << nLayer != dst->width)
|| ((dst->height >> nLayer) << nLayer != dst->height)
|| (src->nChannels != 1)
|| (dst->nChannels != 1)
|| (nLayer <= 0))
{
return;
}
CvMat* pMatData = NULL;//用於儲存計算過程中的向量
CvMat* pMatCA = NULL;
CvMat* pMatCD = NULL;
CvMat* pMatDst = cvCreateMat(dst->height, dst->width, CV_64FC1);//結果矩陣
CvMat tmp;
int nWidth = dst->width;
int nHeight = dst->height;
int nHalfW = nWidth / 2;
int nHalfH = nHeight / 2;
int i, x, y;
double* *pfDst = (double**)(malloc(sizeof(double*) * pMatDst->height));//pMatDst資料的起始地址
double* pfCA;//CA資料起始地址
double* pfCD;//CD資料起始地址
double* pfData;//Data資料起始地址
//儲存影象資料每行的起始地址
for (y = 0; y < nHeight; y++)
{
pfDst[y] = (double*)(pMatDst->data.ptr + y * pMatDst->step);
}
//預先填充pMatDst
cvZero(pMatDst);
cvGetSubRect(pMatDst, &tmp, cvRect(0, 0, src->width, src->height));
cvScale(src, &tmp);
while (nLayer > 0)
{
//行變換
pMatData = cvCreateMat(1, nWidth, CV_64FC1);
pMatCA = cvCreateMat(1, nHalfW, CV_64FC1);
pMatCD = cvCreateMat(1, nHalfW, CV_64FC1);
y = 0;
for (y = 0; y < nHeight; y++)
{
pfCA = (double*)(pMatCA->data.ptr);
pfCD = (double*)(pMatCD->data.ptr);
pfData = (double*)(pMatData->data.ptr);
//獲取每一行資料
for (i = 0; i < nWidth; i++)
{
pfData[i] = pfDst[y][i];
}
cvDWT(pMatData, pMatCA, pMatCD, type);//對每一行資料進行一維快速小波變換
//將小波變換結果拼接到一起並設定到pMatDst中
for (i = 0; i < nWidth; i++)
{
if (i < nHalfW)
{
pfDst[y][i] = pfCA[i];
}
else
{
pfDst[y][i] = pfCD[i - nHalfW];
}
}
}
cvReleaseMat(&pMatData);
cvReleaseMat(&pMatCA);
cvReleaseMat(&pMatCD);
//列變換
pMatData = cvCreateMat(1, nHeight, CV_64FC1);
pMatCA = cvCreateMat(1, nHalfH, CV_64FC1);
pMatCD = cvCreateMat(1, nHalfH, CV_64FC1);
y = 0;
for (x = 0; x < nWidth; x++)
{
pfCA = (double*)(pMatCA->data.ptr);
pfCD = (double*)(pMatCD->data.ptr);
pfData = (double*)(pMatData->data.ptr);
//獲取每一列資料
for (i = 0; i < nHeight; i++)
{
pfData[i] = pfDst[i][x];
}
cvDWT(pMatData, pMatCA, pMatCD, type);//對每一列資料進行一維快速小波變換
//將小波變換結果拼接到一起並設定到dst中
for (i = 0; i < nHeight; i++)
{
if (i < nHalfH)
{
pfDst[i][x] = pfCA[i];
}
else
{
pfDst[i][x] = pfCD[i - nHalfH];
}
}
}
cvReleaseMat(&pMatData);
cvReleaseMat(&pMatCA);
cvReleaseMat(&pMatCD);
//一層變換後的寬度長度縮小
nWidth = nHalfW;
nHeight = nHalfH;
nHalfW = nHalfW / 2;
nHalfH = nHalfH / 2;
nLayer--;
}
//縮放以便顯示
cvScale(pMatDst, dst);
}
相關文章
- 【影像處理筆記】小波變換筆記
- 影象處理1--傅立葉變換(Fourier Transform )ORM
- [Python影象處理] 四.影象平滑之均值濾波、方框濾波、高斯濾波及中值濾波Python
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- 小波變換與深度學習深度學習
- 影象處理之影象增強
- 小波變換與傅立葉變換的區別
- 15分鐘理解數字影象中的二維傅立葉變換語義
- [Python影象處理] 八.影象腐蝕與影象膨脹Python
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- 數字影象處理DIP
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- [Python影象處理] 一.影象處理基礎知識及OpenCV入門函式PythonOpenCV函式
- 影象中的畫素處理
- Metal入門教程(二)三維變換
- 影像處理技術(二)濾波去噪(上)
- [Python影象處理] 三.獲取影象屬性、興趣ROI區域及通道處理Python
- 小波變換檢測訊號突變點的MATLAB實現Matlab
- 日常運維之TX鎖處理(二)運維
- 數字影象處理-第一節
- 影象處理庫GPUImage簡單使用GPUUI
- [Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素PythonOpenCV
- 影象處理的濾鏡演算法演算法
- 實戰 | 用Python做影象處理(一)Python
- 影象傅立葉變換,幅度譜,相位譜
- MatLab 基本影像處理(3)——函式變換Matlab函式
- java日期時間各種變換及處理Java
- Python 影像處理 OpenCV (7):影像平滑(濾波)處理PythonOpenCV
- Luminar 4 for MacOS影象後期處理軟體Mac
- Python 影像處理 OpenCV (5):影像的幾何變換PythonOpenCV
- Book of Shaders 02 - 矩陣:二維仿射變換練習矩陣
- 【筆記】基於Python的數字影象處理筆記Python
- Opencv-Python 影象透視變換cv2.warpPerspectiveOpenCVPython
- 相位掩膜+傅立葉變換進行影象加密加密
- 資料預處理-資料整合與資料變換
- 手把手教你用Taro框架寫一個影象處理類微信小程式框架微信小程式
- 換行符處理
- 微信小程式:小程式碼、小程式二維碼、普通二維碼微信小程式
- CGAffineTransform二維檢視旋轉、縮放、平移變換詳解ORM