影象處理 二維小波變換
程式設計環境: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-OpenCV 處理影象(八):影象二值化處理PythonOpenCV
- [Python影象處理] 四.影象平滑之均值濾波、方框濾波、高斯濾波及中值濾波Python
- 小波變換與傅立葉變換的區別
- 【DWT筆記】傅立葉變換與小波變換筆記
- MATLAB數字影象處理(二)影象增強Matlab
- 小波變換與深度學習深度學習
- MATLAB數字影象處理(一)基礎操作和傅立葉變換Matlab
- 15分鐘理解數字影象中的二維傅立葉變換語義
- 處理多維度變化——橋接模式(二)橋接模式
- iOS 影象處理 - 影象拼接iOS
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- 小波變換教程(1):基本原理
- Python-OpenCV 處理影象(二):濾鏡和影象運算PythonOpenCV
- 影象處理之影象增強
- UIImage 影象處理UI
- Bayer影象處理
- 【數字影象處理】六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
- Python-OpenCV 處理影象(七):影象灰度化處理PythonOpenCV
- sed處理變數替換變數
- 前端影象處理指南前端
- c#影象處理C#
- 影像處理技術(二)濾波去噪(上)
- Metal入門教程(二)三維變換
- 數字影象處理DIP
- 柵格影象的處理
- 小波變換檢測訊號突變點的MATLAB實現Matlab
- [Python影象處理] 八.影象腐蝕與影象膨脹Python
- OpencV_Python影象濾波函式小結OpenCVPython函式
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- C++影象處理 -- 影象黑白調整應用C++
- 日常運維之TX鎖處理(二)運維
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- 【數字影象處理】五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
- 影象中的畫素處理