打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
哈尔小波变换的原理及其实现(Haar)
Haar小波在图像处理和数字水印等方面应用较多,这里简单的介绍一下哈尔小波的基本原理以及其实现情况。

 

一、Haar小波的基本原理

数学理论方面的东西我也不是很熟悉,这边主要用简单的例子来介绍下Haar小波的使用情况。

 

例如:有a=[8,7,6,9]四个数,并使用b[4]数组来保存结果.

则一级Haar小波变换的结果为:

b[0]=(a[0]+a[1])/2, b[2]=(a[0]-a[1])/2

b[1]=(a[2]+a[3])/2, b[3]=(a[2]-a[3])/2

即依次从数组中取两个数字,计算它们的和以及差,并将和一半和差的一半依次保存在数组的前半部分和后半部分。

例如:有a[8],要进行一维Haar小波变换,结果保存在b[8]中

则一级Haar小波变换的结果为:

b[0]=(a[0]+a[1])/2, b[4]=(a[0]-a[1])/2

b[1]=(a[2]+a[3])/2, b[5]=(a[2]-a[3])/2

b[2]=(a[4]+a[5])/2, b[6]=(a[4-a[5]])/2

b[3]=(a[6]+a[7])/2, b[7]=(a[6]-a[7])/2

 

如果需要进行二级Haar小波变换的时候,只需要对b[0]-b[3]进行Haar小波变换.

对于二维的矩阵来讲,每一级Haar小波变换需要先后进行水平方向和竖直方向上的两次一维小波变换,行和列的先后次序对结果不影响。

 

二、Haar小波的实现

使用opencv来读取图片及像素,对图像的第一个8*8的矩阵做了一级小波变换

 

  1. #include <cv.h>
  2. #include <highgui.h>
  3. #include <iostream>
  4. using namespace std;
  5. int main()
  6. {
  7. IplImage* srcImg;
  8. double imgData[8][8];
  9. int i,j;
  10. srcImg=cvLoadImage("lena.bmp",0);
  11. cout<<"原8*8数据"<<endl;
  12. for( i=0;i<8;i++)
  13. {
  14. for( j=0;j<8;j++)
  15. {
  16. imgData[i][j]=cvGetReal2D(srcImg,i+256,j+16);
  17. cout<<imgData[i][j]<<" ";
  18. }
  19. cout<<endl;
  20. }
  21. double tempData[8];
  22. //行小波分解
  23. for( i=0;i<8;i++)
  24. {
  25. for( j=0;j<4;j++)
  26. {
  27. double temp1=imgData[i][2*j];
  28. double temp2=imgData[i][2*j+1];
  29. tempData[j]=(temp1+temp2)/2;
  30. tempData[j+4]=(temp1-temp2)/2;
  31. }
  32. for( j=0;j<8;j++)
  33. imgData[i][j]=tempData[j];
  34. }
  35. //列小波分解
  36. for( i=0;i<8;i++)
  37. {
  38. for( j=0;j<4;j++)
  39. {
  40. double temp1=imgData[2*j][i];
  41. double temp2=imgData[2*j+1][i];
  42. tempData[j]=(temp1+temp2)/2;
  43. tempData[j+4]=(temp1-temp2)/2;
  44. }
  45. for( j=0;j<8;j++)
  46. imgData[j][i]=tempData[j];
  47. }
  48. cout<<"1级小波分解数据"<<endl;
  49. for( i=0;i<8;i++)
  50. {
  51. for( j=0;j<8;j++)
  52. {
  53. cout<<imgData[i][j]<<" ";
  54. }
  55. cout<<endl;
  56. }
  57. //列小波逆分解
  58. for( i=0;i<8;i++)
  59. {
  60. for( j=0;j<4;j++)
  61. {
  62. double temp1=imgData[j][i];
  63. double temp2=imgData[j+4][i];
  64. tempData[2*j]=temp1+temp2;
  65. tempData[2*j+1]=temp1-temp2;
  66. }
  67. for( j=0;j<8;j++)
  68. {
  69. imgData[j][i]=tempData[j];
  70. }
  71. }
  72. //行小波逆分解
  73. for( i=0;i<8;i++)
  74. {
  75. for( j=0;j<4;j++)
  76. {
  77. double temp1=imgData[i][j];
  78. double temp2=imgData[i][j+4];
  79. tempData[2*j]=temp1+temp2;
  80. tempData[2*j+1]=temp1-temp2;
  81. }
  82. for( j=0;j<2*4;j++)
  83. {
  84. imgData[i][j]=tempData[j];
  85. }
  86. }
  87. cout<<"1级小波逆分解数据"<<endl;
  88. for( i=0;i<8;i++)
  89. {
  90. for( j=0;j<8;j++)
  91. {
  92. cout<<imgData[i][j]<<" ";
  93. }
  94. cout<<endl;
  95. }
  96. return 0;
  97. }  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
怎么求一个点是否在一个多边形内呢?
在Visual C++ 6.0上实现矩阵的各种运算
雅可比(Jacobi)迭代算法的C++实现 - 楼竞网站
产生在球面上均匀分布的点
【数值分析】插值法:拉格朗日插值、牛顿插值
1.编写一个求方程ax2 + bx + c = 0的根 的程序,用3个函数分别求当b2-4ac大于零、等于零、和小于零时的方程的根。要求从主函数输入a,b,c的值并输出结果。
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服