问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

求助:opencv实现的离散小波变换结果分析

发布网友 发布时间:2022-09-23 15:59

我来回答

1个回答

热心网友 时间:2024-01-22 16:44

代码如下:
// DWT.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

// 二维离散小波变换(单通道浮点图像)
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;
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{
// 小波变换层数
int nLayer = 2;
// 输入彩色图像
IplImage *pSrc = cvLoadImage("lena.jpg", 1);
// 计算小波图象大小,使其width和height都是2的倍数
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);//使用线性变换转换数组:pWavelet = pSrc*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);//设置感兴趣通道channel
cvCopy(pWavelet, pImage, NULL);//pImage为灰度图像,将pWavelet的每个通道数据copy到pImage中
// 二维离散小波变换
DWT(pImage, nLayer);//对每个通道进行DWT
// 二维离散小波恢复
// IDWT(pImage, nLayer);
cvCopy(pImage, pWavelet, NULL);//将每个通道变换后的数据存入pWavelet的对应通道中
}
cvSetImageCOI(pWavelet, 0);
cvReleaseImage(&pImage);
}
// 小波变换图象
cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));
cvConvertScale(pWavelet, pSrc, 1, 128);
cvResetImageROI(pWavelet); // 本行代码有点多余,但有利用养成良好的编程习惯
cvReleaseImage(&pWavelet);
}
// 显示图像pSrc
cvNamedWindow("dwt",1);
cvShowImage("dwt",pSrc);
cvWaitKey(0);
cvDestroyWindow("dwt");

// ...
cvReleaseImage(&pSrc);
cvReleaseImage(&pSrc0);

return 0;
}
求助:opencv实现的离散小波变换结果分析

// DWT.cpp : 定义控制台应用程序的入口点。// include "stdafx.h"include "cv.h"include "highgui.h"// 二维离散小波变换(单通道浮点图像)void DWT(IplImage *pImage, int nLayer){ // 执行条件 if (pImage){ if (pImage-&gt;nChannels == 1 &amp;&amp; pImage-&gt;depth == IPL_DEPTH_32F &amp;&amp; (...

怎么把jpg转换成dwt格式

执行DWT转换:在图像处理软件中,查找执行离散小波变换(DWT)的选项或函数。具体的步骤可能因软件而异,但通常会有一个专门的功能或命令可用于执行DWT转换。你可以在软件的文档或帮助文件中查找有关DWT的信息。指定DWT参数:DWT转换通常涉及一些参数,例如小波类型、分解级别和滤波器选择。根据你的需求,选...

opencv的人脸识别基于什么特征

拓扑图的顶点是采用小波变换特征,对光线、角度和尺寸都具有一定的适应性,且能适应表情和视角的变化,其在理论上改进了特征脸算法的一些缺点。 基于三维数据的人脸识别方法 一个完整的人脸识别系统包括人脸面部数据的获取、数据分析处理和最终结果输出三个部分。图2-1 显示了三维人脸识别的基本步骤:1 、通过三维数据采集...

怎么把小波变换分成低频和高频部分,单独进行处理,高人指教,在线等...

对于多层的DWT你只要对小波系数逐层减半即可实现DWT每层尺度伸长一倍的效果。4.这时你会碰到卷积滤波的边缘效应,你需要对原始信号进行扩展,你可以参看matlab中dwtmode函数的帮助文档;5.对于二维DWT,你还要实现张量积C代码的实现,还有二维离散采样(行抽取,列抽取和斜抽取)的C代码(在dwt2函数的帮助文...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
就读华南师范大学网络教育学院需要中专毕业吗 皮蛋肉粥的做法和配方 ...读华南师范大学的网络教育,但不知道在哪报名?学校有报名点吗?_百度... 银行装etc有什么套路 瑞达时代公司简介 ...计算数学题时,把减数24错写成44,算出差是30,这道题的正确是多少? ...把减数132看成了123,结果算出的差是239,这道题的被减数是()。_百度... ...把减数269看成296算出的结果足543这道算试正确的结果是怎样算_百度... ...做一道减法题时,把减数23看成32,结果是46,这道题的被减数是多少? 灵魂独立于生命而存在,生命可以感知它的存在。到底灵魂是一个什么概念... opencv霍夫变换怎么多次使用?? opencv中霍夫变换有gpu版本吗 如何用openCV进行坐标变换 2021新手看过来:几个步骤教你如何开淘宝店铺 高速开车的几个禁忌,你了解吗,新手司机看过来 有什么养宠物的手机游戏 养宠物的手机游戏有哪些? 池塘李昆纯出自哪本书? 词是一种南方文学,其理由是什么? 楚辞的艺术特色是什么? 用opencv 写视频文件 什么是液体墙纸 初二英语题目~~~急!!! refresh是什么方法 肠粉的米浆是怎么调的 孩子不吃饭该怎么办? 各大银行信用卡还款容时期限、容差金额-卡超盟 soul小派对聊天会涨心么 家用中央空调大金vrv和日立vam系列到底哪个性 柚子剥好了放外皮里保存多久 七年级下册历史材料题训练及答案 七年级下册历史期末大题及答案 峥峥甲子的意思? 幼儿园管理的以人为本理念 幼儿园频频出事,现在的幼师为什么如此没有耐心? 幼儿园工作内容 幼儿园老师工作内容 培养幼儿家乡归属感的阻碍有哪些 参加闺蜜婚礼送什么礼物好 六十甲子歌诀是什么? 哲学的基本知识 给狗狗买的猪大骨怎么处理 猪大骨应该怎么做给狗狗吃 综素上的学习体检传统文化例文? 在拼多多不小心买了券怎么退款? 马生字词拼音和解释 便利店不交税可以吗 丰田威驰自动挡版怎么样? 丰田威驰2008款1.6自动挡怎么样 丰田威驰质量怎么样,威驰有什么质量问题 丰田威驰的质量值得信赖吗?它的配置高吗?
  • 焦点

最新推荐

猜你喜欢

热门推荐