图像处理之基础---一维小波变换,可多次分解

1、题目:一维小波变换,可多次分解

2、原理:卷积核变为Daubechies正交小波基h[]和g[]的交替形式。增加了多次分解的功能。

3、代码:

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define LENGTH 4096//信号长度
  5. /*****************************************************************
  6. * 一维卷积函数
  7. *
  8. * 说明: 循环卷积,卷积结果的长度与输入信号的长度相同
  9. *
  10. * 输入参数: data[],输入信号; h[],Daubechies小波基低通滤波器系数;
  11. *            g[],Daubechies小波基高通滤波器系数; cov[],卷积结果;
  12. *            n,输入信号长度; m,卷积核长度.
  13. *
  14. * 李承宇, [email protected]
  15. *
  16. *  2010-08-22
  17. *****************************************************************/
  18. void Covlution(double data[], double h[], double g[], double cov[]
  19. , int n, int m)
  20. {
  21. int i = 0;
  22. int j = 0;
  23. int k = 0;
  24. //将cov[]清零
  25. for(i = 0; i < n; i++)
  26. {
  27. cov[i] = 0;
  28. }
  29. //****************************************************
  30. //奇数行用h[]进行卷积
  31. //****************************************************
  32. //前m/2+1行
  33. i = 0;
  34. for(j = 0; j < m/2; j+=2, i+=2)
  35. {
  36. for(k = m/2-j; k < m; k++ )
  37. {
  38. cov[i] += data[k-(m/2-j)] * h[k];//k针对core[k]
  39. }
  40. for(k = n-m/2+j; k < n; k++ )
  41. {
  42. cov[i] += data[k] * h[k-(n-m/2+j)];//k针对data[k]
  43. }
  44. }
  45. //中间的n-m行
  46. for( ; i <= (n-m)+m/2; i+=2)
  47. {
  48. for( j = 0; j < m; j++)
  49. {
  50. cov[i] += data[i-m/2+j] * h[j];
  51. }
  52. }
  53. //最后m/2-1行
  54. //  i = ( (n - m) + m/2 + 1 )/2*2;//**********
  55. for(j = 1; j <= m/2; j+=2, i+=2)
  56. {
  57. for(k = 0; k < j; k++)
  58. {
  59. cov[i] += data[k] * h[m-j-k];//k针对data[k]
  60. }
  61. for(k = 0; k < m-j; k++)
  62. {
  63. cov[i] += h[k] * data[n-(m-j)+k];//k针对core[k]
  64. }
  65. }
  66. //****************************************************
  67. //偶数行用g[]进行卷积
  68. //****************************************************
  69. //前m/2+1行
  70. i = 1;
  71. for(j = 0; j < m/2; j+=2, i+=2)
  72. {
  73. for(k = m/2-j; k < m; k++ )
  74. {
  75. cov[i] += data[k-(m/2-j)] * g[k];//k针对core[k]
  76. }
  77. for(k = n-m/2+j; k < n; k++ )
  78. {
  79. cov[i] += data[k] * g[k-(n-m/2+j)];//k针对data[k]
  80. }
  81. }
  82. //中间的n-m行
  83. for( ; i <= (n-m)+m/2; i+=2)
  84. {
  85. for( j = 0; j < m; j++)
  86. {
  87. cov[i] += data[i-m/2+j] * g[j];
  88. }
  89. }
  90. //最后m/2-1行
  91. //  i = ( (n - m) + m/2 + 1 ) ;//*********
  92. for(j = 1; j <= m/2; j+=2, i+=2)
  93. {
  94. for(k = 0; k < j; k++)
  95. {
  96. cov[i] += data[k] * g[m-j-k];//k针对data[k]
  97. }
  98. for(k = 0; k < m-j; k++)
  99. {
  100. cov[i] += g[k] * data[n-(m-j)+k];//k针对core[k]
  101. }
  102. }
  103. }
  104. /*****************************************************************
  105. *   排序函数
  106. *
  107. *   将卷积后的结果进行排序,使尺度系数和小波系数分开
  108. *****************************************************************/
  109. void Sort(double data[], double sort[], int n)
  110. {
  111. for(int i = 0; i < n; i+=2)
  112. {
  113. sort[i/2] = data[i];
  114. }
  115. for(i = 1; i < n; i+=2)
  116. {
  117. sort[n/2+i/2] = data[i];
  118. }
  119. }
  120. /*****************************************************************
  121. * 一维小波变换函数
  122. *
  123. * 说明: 一维小波变换,可进行多次分解 
  124. *
  125. * 输入参数: input[],输入信号; output[],小波变换结果,包括尺度系数
  126. * 和小波系数两部分; temp[],存放中间结果;h[],Daubechies小波基低通滤
  127. * 波器系数;g[],Daubechies小波基高通滤波器系数;n,输入信号长度; m,
  128. * Daubechies小波基紧支集长度; nStep,小波变换分解次数
  129. *
  130. * 李承宇, [email protected]
  131. *
  132. *  2010-08-22
  133. *****************************************************************/
  134. void DWT1D(double input[], double output[], double temp[], double h[],
  135. double g[], int n, int m, int nStep)
  136. {
  137. int i = 0;
  138. for(i = 0; i < n; i++)
  139. {
  140. output[i] = input[i];
  141. }
  142. for(i = 0; i < nStep; i++)
  143. {
  144. Covlution(output, h, g, temp, n, m);
  145. Sort(temp, output, n);
  146. n = n/2;
  147. }
  148. }
  149. void main()
  150. {
  151. double data[LENGTH];//输入信号
  152. double temp[LENGTH];//中间结果
  153. double data_output[LENGTH];//一维小波变换后的结果
  154. int n = 0;//输入信号长度
  155. int m = 6;//Daubechies正交小波基长度
  156. int nStep = 6;//分解级数
  157. int i = 0;
  158. char s[32];//从txt文件中读取一行数据
  159. static double h[] = {.332670552950, .806891509311, .459877502118,
  160. -.135011020010, -.085441273882, .035226291882};
  161. static double g[] = {.035226291882, .085441273882, -.135011020010,
  162. -.459877502118, .806891509311, -.332670552950};
  163. //读取输入信号
  164. FILE *fp;
  165. fp=fopen("data.txt","r");
  166. if(fp==NULL) //如果读取失败
  167. {
  168. printf("错误!找不到要读取的文件/"data.txt/"/n");
  169. exit(1);//中止程序
  170. }
  171. while( fgets(s, 32, fp) != NULL )//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值
  172. {
  173. //  fscanf(fp,"%d", &data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊
  174. data[n] = atof(s);
  175. n++;
  176. }
  177. //一维小波变换
  178. DWT1D(data, data_output, temp, h, g, n, m, nStep);
  179. //一维小波变换后的结果写入txt文件
  180. fp=fopen("test.txt","w");
  181. //打印一维小波变换后的结果
  182. for(i = 0; i < n/pow(2,nStep-1); i++)///pow(2,nStep-1)
  183. {
  184. printf("%f/n", data_output[i]);
  185. fprintf(fp,"%f/n", data_output[i]);
  186. }
  187. //关闭文件
  188. fclose(fp);
  189. }

4、测试结果:

输入信号x(i)为:

取f1 = 5, f2 = 10, f0 = 320, n = 512。x(i)如图1所示:

图1 输入信号

各级分解的结果如图2~图7所示,左半部分为尺度系数,右半部分为小波系数:

图2 1级分解结果

图3 2级分解结果

图4 3级分解结果

图5 4级分解结果

图6 5级分解结果

图7 6级分解结果

图8是各级小波系数和第6级尺度系数的完整结果:

图8 第6级尺度系数和各级小波系数的完整结果

时间: 2024-08-07 08:40:16

图像处理之基础---一维小波变换,可多次分解的相关文章

图像处理之基础---卷积,滤波,平滑

/*今天师弟来问我,CV的书里到处都是卷积,滤波,平滑……这些概念到底是什么意思,有什么区别和联系,瞬间晕菜了,学了这么久CV,卷积,滤波,平滑……这些概念每天都念叨好几遍,可是心里也就只明白个大概的意思,赶紧google之~ 发现自己以前了解的真的很不全面,在此做一些总结,以后对这种基本概念要深刻学习了~*/ 1.图像卷积(模板) (1).使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)

图像处理之基础---卷积模板简介

1.使用模板处理图像相关概念:       模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值. 卷积核:卷积时使用到的权,用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行.列都是奇数,是一个权矩阵. 卷积示例: 假设3 * 3的像素区域R与卷积核G分别为: 则卷积运算为: R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 +

图像处理之基础---卷积傅立叶变换中的复数

整个看FFT过程中复数一直很折磨我. 原本的实数的东西通过复数表达很像旋转矩阵用quaternion来表达,尽管旋转vector还是要用matrix来做,但是通过用quaternion表达的旋转意义可以做插值等很多快速的操作,而且内存消耗也小,在做完这些操作之后再转成matrix用就好了. 复数表达也是类似. a+bi = M*(cos(theta)+sin(theta)*i)----极坐标 cos(x) + sin(x)*i = exp(x*i)----欧拉公式 这个用欧拉公式转出来的exp(

图像处理之基础---内积、点积

定义在数学中,数量积(dotproduct;scalarproduct,也称为标量积.点积.点乘)是接受在实数R上的两个矢量并返回一个实数值标量的二元运算.它是欧几里得空间的标准内积.两个矢量a=[a1,a2,…,an]和b=[b1,b2,…,bn]的点积定义为:a·b=a1b1+a2b2+……+anbn使用矩阵乘法并把(纵列)矢量当作n×1矩阵,点积还可以写为:a·b=a^T*b,这里的a^T指示矩阵a的转置. 内积(inner product),又称 数量积(scalar product).

图像处理之基础---二维卷积运算原理剖析

卷积运算(Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表示函数f 与经过翻转和平移与g 的重叠部分的累积.如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广.假设: f(x),g(x)是R1上的两个可积函数,并且积分是存在的.这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x). 两个向量卷积,说白了就是多项式乘法.下面用个矩阵例子说明其工作原理: a和d的卷积就是

图像处理之基础---卷积模板运算

1.使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算.      卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相                乘,所有乘积之和作为区域中心像素的新值.      卷积核:卷积时使用到的权用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行.列都是奇数,              是一个权矩阵.      卷积示例:              3 * 3 的像素区域R与卷积核G的卷积运算: 

图像处理之基础---矩阵求逆实现

最近做一个加密算法遇到需要计算矩阵的逆,闲着无聊,记录一下,以后免得再麻烦. [cpp] view plaincopyprint? #include #include #include #define MAX 20 #define E 0.000000001 /** * 计算矩阵src的模 */ double calculate_A( double src[][MAX], int n ) { int i,j,k,x,y; double tmp[MAX][MAX], t; double resul

蓝鸥Unity开发基础—— 一维数组学习笔记

蓝鸥Unity开发基础-- 一维数组学习笔记 一.数组 之前我们学过很多数据类型,今天我们来学习数字,数字也是一种数据类型,那么,具体的数组是如何定义的? 数组:相同数据类型的成员组成的一组数据 Int类型数组:4  7  12  3  5--数组元素 Float数据类型数字:11.5 4.62 7.1 2.21 9.3--数组元素 数组中每一个元素都会分配一个数组下标,数组下标是从0开始的,有序排列,如:0 1 2 3 4 二.声明并初始化数组: 数组也是数据类型,所以也可以声明变量.使用ne

图像处理之基础---频域分析

1.频域值得坐标轴 1.在傅里叶变换中,低频主要决定图像在平滑区域中总体灰度级的现实,而高频决定图像细节部分,如边缘和噪声: 滤波器: 使低频通过而使高频衰减的滤波器称为“低通滤波器” 相反特性的滤波器 称为“高通滤波器” 被低通滤波的图像比原始图像少了一些尖锐的细节部分,因为高频部分已被衰减.同样,被高通滤波的图像在平滑区域 中将减少一些灰度 级的变化,并突出过渡(边缘)灰度级的细节.这样的图像将更为锐化 preference:http://www.cnblogs.com/itchq/p/38