OpenCV下的小波变换 opencv 图像小波去噪

http://blog.csdn.net/h349117102/article/details/8954661

#include <opencv2highguihighgui.hpp>

#include <math.h>

#include <iostream>

using namespace std;

//二维离散变换小波源代码

void DWT(IplImage *pImage, int nLayer)

{

// 执行条件

if (pImage)

{

if (pImage->nChannels == 1 &&

pImage->depth == IPL_DEPTH_32F &&

((pImage->width >> nLayer) << nLayer) == pImage->width &&

((pImage->height >> nLayer) << nLayer) == pImage->height)

{

int i, x, y, n;

float fValue = 0;

float fRadius = sqrt(2.0f);

int nWidth = pImage->width;

int nHeight = pImage->height;

int nHalfW = nWidth / 2;

int nHalfH = nHeight / 2;

float **pData = new float*[pImage->height];

float *pRow = new float[pImage->width];

float *pColumn = new float[pImage->height];

for (i = 0; i < pImage->height; i++) pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);

// 多层小波变换

for (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2)

{

// 水平变换

for (y = 0; y < nHeight; y++)

{

// 奇偶分离

memcpy(pRow, pData[y], sizeof(float) * nWidth);

for (i = 0; i < nHalfW; i++)

{

x = i * 2;

pData[y][i] = pRow[x];

pData[y][nHalfW + i] = pRow[x + 1];

}

// 提升小波变换

for (i = 0; i < nHalfW - 1; i++)

{

fValue = (pData[y][i] + pData[y][i + 1]) / 2;

pData[y][nHalfW + i] -= fValue;

}

fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2;

pData[y][nWidth - 1] -= fValue;

fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4;

pData[y][0] += fValue;

for (i = 1; i < nHalfW; i++)

{

fValue = (pData[y][nHalfW + i] + pData[y][nHalfW + i - 1]) / 4;

pData[y][i] += fValue;

}

// 频带系数

for (i = 0; i < nHalfW; i++)

{

pData[y][i] *= fRadius;

pData[y][nHalfW + i] /= fRadius;

}

}

// 垂直变换

for (x = 0; x < nWidth; x++)

{

// 奇偶分离

for (i = 0; i < nHalfH; i++)

{

y = i * 2;

pColumn[i] = pData[y][x];

pColumn[nHalfH + i] = pData[y + 1][x];

}

for (i = 0; i < nHeight; i++)

{

pData[i][x] = pColumn[i];

}

// 提升小波变换

for (i = 0; i < nHalfH - 1; i++)

{

fValue = (pData[i][x] + pData[i + 1][x]) / 2;

pData[nHalfH + i][x] -= fValue;

}

fValue = (pData[nHalfH - 1][x] + pData[nHalfH - 2][x]) / 2;

pData[nHeight - 1][x] -= fValue;

fValue = (pData[nHalfH][x] + pData[nHalfH + 1][x]) / 4;

pData[0][x] += fValue;

for (i = 1; i < nHalfH; i++)

{

fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4;

pData[i][x] += fValue;

}

// 频带系数

for (i = 0; i < nHalfH; i++)

{

pData[i][x] *= fRadius;

pData[nHalfH + i][x] /= fRadius;

}

}

}

delete[] pData;

delete[] pRow;

delete[] pColumn;

}

}

}

// 二维离散小波恢复(单通道浮点图像)

void IDWT(IplImage *pImage, int nLayer)

{

// 执行条件

if (pImage)

{

if (pImage->nChannels == 1 &&

pImage->depth == IPL_DEPTH_32F &&

((pImage->width >> nLayer) << nLayer) == pImage->width &&

((pImage->height >> nLayer) << nLayer) == pImage->height)

{

int i, x, y, n;

float fValue = 0;

float fRadius = sqrt(2.0f);

int nWidth = pImage->width >> (nLayer - 1);

int nHeight = pImage->height >> (nLayer - 1);

int nHalfW = nWidth / 2;

int nHalfH = nHeight / 2;

float **pData = new float*[pImage->height];

float *pRow = new float[pImage->width];

float *pColumn = new float[pImage->height];

for (i = 0; i < pImage->height; i++)

{

pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);

}

// 多层小波恢复

for (n = 0; n < nLayer; n++, nWidth *= 2, nHeight *= 2, nHalfW *= 2, nHalfH *= 2)

{

// 垂直恢复

for (x = 0; x < nWidth; x++)

{

// 频带系数

for (i = 0; i < nHalfH; i++)

{

pData[i][x] /= fRadius;

pData[nHalfH + i][x] *= fRadius;

}

// 提升小波恢复

fValue = (pData[nHalfH][x] + pData[nHalfH + 1][x]) / 4;

pData[0][x] -= fValue;

for (i = 1; i < nHalfH; i++)

{

fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4;

pData[i][x] -= fValue;

}

for (i = 0; i < nHalfH - 1; i++)

{

fValue = (pData[i][x] + pData[i + 1][x]) / 2;

pData[nHalfH + i][x] += fValue;

}

fValue = (pData[nHalfH - 1][x] + pData[nHalfH - 2][x]) / 2;

pData[nHeight - 1][x] += fValue;

// 奇偶合并

for (i = 0; i < nHalfH; i++)

{

y = i * 2;

pColumn[y] = pData[i][x];

pColumn[y + 1] = pData[nHalfH + i][x];

}

for (i = 0; i < nHeight; i++) pData[i][x] = pColumn[i];

}

// 水平恢复

for (y = 0; y < nHeight; y++)

{

// 频带系数

for (i = 0; i < nHalfW; i++)

{

pData[y][i] /= fRadius;

pData[y][nHalfW + i] *= fRadius;

}

// 提升小波恢复

fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4;

pData[y][0] -= fValue;

for (i = 1; i < nHalfW; i++)

{

fValue = (pData[y][nHalfW + i] + pData[y][nHalfW + i - 1]) / 4;

pData[y][i] -= fValue;

}

for (i = 0; i < nHalfW - 1; i++)

{

fValue = (pData[y][i] + pData[y][i + 1]) / 2;

pData[y][nHalfW + i] += fValue;

}

fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2;

pData[y][nWidth - 1] += fValue;

// 奇偶合并

for (i = 0; i < nHalfW; i++)

{

x = i * 2;

pRow[x] = pData[y][i];

pRow[x + 1] = pData[y][nHalfW + i];

}

memcpy(pData[y], pRow, sizeof(float) * nWidth);

}

}

delete[] pData;

delete[] pRow;

delete[] pColumn;

}

}

}

int main()

{

// 小波变换层数

int nLayer = 2;

// 输入彩色图像

IplImage *pSrc = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);

// 计算小波图象大小

CvSize size = cvGetSize(pSrc);

if ((pSrc->width >> nLayer) << nLayer != pSrc->width)size.width = ((pSrc->width >> nLayer) + 1) << nLayer;

if ((pSrc->height >> nLayer) << nLayer != pSrc->height) size.height = ((pSrc->height >> nLayer) + 1) << nLayer;

// 创建小波图象

IplImage *pWavelet = cvCreateImage(size, IPL_DEPTH_32F, pSrc->nChannels);

if (pWavelet) {

// 小波图象赋值

cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));

cvConvertScale(pSrc, pWavelet, 1, -128);

cvResetImageROI(pWavelet);

// 彩色图像小波变换

IplImage *pImage = cvCreateImage(cvGetSize(pWavelet), IPL_DEPTH_32F, 1);

if (pImage) {

for (int i = 1; i <= pWavelet->nChannels; i++) {

cvSetImageCOI(pWavelet, i);

cvCopy(pWavelet, pImage, NULL);

// 二维离散小波变换

DWT(pImage, nLayer);

// 二维离散小波恢复

// IDWT(pImage, nLayer);

cvCopy(pImage, pWavelet, NULL);

}

cvSetImageCOI(pWavelet, 0);

cvReleaseImage(&pImage);

}

// 小波变换图象

cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));

cvConvertScale(pWavelet, pSrc, 1, 128);

cvResetImageROI(pWavelet);

cvReleaseImage(&pWavelet);

}
OpenCV下的小波变换 opencv 图像小波去噪

// 显示图像pSrc

cv::namedWindow("result");

cvShowImage("result",pSrc);

cv::waitKey(0);

cvReleaseImage(&pSrc);

}

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/114589.html

更多阅读

酸甜酥香的下饭小丸子------糖醋小丸子 酸甜糖醋酱汁

7月手把手diy课 7月免费课酸甜酥香的下饭小丸子------糖醋小丸子原料:猪肉馅300克北豆腐300克姜1小块(约半个鸡蛋大)鸡蛋1个面粉1茶匙(5克)土豆或玉米淀粉1茶匙(5克)丸子调料:料酒1汤匙(15ml)生抽2汤匙(30ml)老抽2汤匙(30ml)盐1/2茶匙(3克)香油1

《借东西的小矮人阿丽埃蒂》 黄阿丽小眼镜蛇 b站

个人感觉,只要是宫崎骏出品的动画片,就一定有可看之处。别的不说,光是细致入微的场景,与那股特有的怀旧感,就值得仔细玩味了。影片改编自英国小说家玛丽.诺顿(MaryNorton)的奇幻小说《地板下的小矮人》,讲述一群住在人类视线外,靠采集日用

ubuntu下类似360的网速测试的小软件 360网速测试

ubuntu下类似360的网速测试的小软件下面给出源码,请使用qt编译//networkspeed.h//以下为头文件内容//读取数据原理:读取ubuntu下/proc内的实时文件,其实相当与在读取实时内存信息#ifndef NETWORKSPEED_H#define NETWORKSPEED_H#in

语言:桃树下的小白兔

今天,我们学习了一个故事,故事的名字叫《桃树下的小白兔》,家长们可根据以下问题来帮助您的孩子复习故事内容。如:故事的名字叫什么?故事里都有谁?小白兔把桃花瓣寄给了哪些好朋友?它们分别把桃花瓣当作什么?你喜欢小白兔吗?为什么?家长们还可

声明:《OpenCV下的小波变换 opencv 图像小波去噪》为网友爱王源不解释分享!如侵犯到您的合法权益请联系我们删除