加载中…
个人资料
大嘴说图像
大嘴说图像
  • 博客等级:
  • 博客积分:0
  • 博客访问:146,556
  • 关注人气:110
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

(含代码)图像的Haar小波变换

(2014-03-07 12:13:04)
标签:

杂谈

(1)图像/矩阵进行Haar小波的基本原理

首先我们简单了解一下二维小波变换的塔式结构。我们知道,一维小波变换其实是将一维原始信号分别经过低通滤波和高通滤波以及二元下抽样得到信号的低频部分L和高频部分H。而根据Mallat算法,二维小波变换可以用一系列的一维小波变换得到。对一幅m行n列的图像,二维小波变换的过程是先对图像的每一行做一维小波变换,得到L和H两个对半部分;然后对得到的LH图像(仍是m行n列)的每一列做一维小波变换。这样经过一级小波变换后的图像就可以分为LL,HL,LH,HH四个部分,如下图所示,就是一级二维小波变换的塔式结构:

(含代码)图像的Haar小波变换

而二级、三级以至更高级的二维小波变换则是对上一级小波变换后图像的左上角部分(LL部分)再进行一级二维小波变换,是一个递归过程。下图是三级二维小波变换的塔式结构图:

(含代码)图像的Haar小波变换

一个图像经过小波分解后,可以得到一系列不同分辨率的子图像,不同分辨率的子图像对应的频率也不同。高分辨率(即高频)子图像上大部分点的数值都接近于0,分辨率越高,这种现象越明显。要注意的是,在N级二维小波分解中,分解级别越高的子图像,频率越低。例如图2的三级塔式结构中,子图像HL2、LH2、HH2的频率要比子图像HL1、LH1、HH1的频率低,相应地分辨率也较低。

题外:haar特征为什么叫haar的一个可能原因

大嘴查了查各种资料,基本没有说清楚,最接近的一种解释如下(大嘴整理了下一段,此段是合并了几种解释):

“Haar特征因为类似于Haar小波而得名,Haar-like features提取过程可看作对图像局部进行Haar小波变换,它反映了图像局部的灰度变化,当然不是直接进行变换,而通常是以一种简便的方式如积分图像。通常作目标检测/识别也不会是对图像整体进行Haar小波变换,而是将图像密集化为一些小块,在每个小块上做变换。对图像整体进行Haar小波变换分析系数当然也可做些边缘检测等工作。Haar型特征的计算是通过积分图像实现的”

看完这段后想想haar的其中一个特征(对角特征):

(含代码)图像的Haar小波变换

是不是和前面介绍的塔型结构比较像,莫非这就是所谓的类似haar小波?哈,有知道准确答案的朋友告诉大嘴一下。

(2)用一行数据进行Haar小波的基本原理

这边主要用简单的例子来介绍下Haar小波的使用情况。例如:有a=[8,7,6,9]四个数,并使用b[4]数组来保存结果. 则一级Haar小波变换的结果为:

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

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

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

b[3]=(a[2]-a[3])/2

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

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

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

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

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

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

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

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

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

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

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

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

通过以上变换,大家可以知道,小波变换是可逆的,即完全可以从b[0]~b[7]反向求出a[0]~a[7]

(3)对图像进行一级小波变换的代码

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

[cpp] view plaincopy

#include <cv.h>

#include <highgui.h>

#include <iostream>

using namespace std;int main()

{

IplImage* srcImg;

double imgData[8][8];

int i,j;

srcImg=cvLoadImage("lena.bmp",0);

cout<<"原8*8数据"<<endl;

for( i=0;i<8;i )

{

for( j=0;j<8;j )

{

imgData[i][j]=cvGetReal2D(srcImg,i 256,j 16);

cout<<imgData[i][j]<<" ";

}

cout<<endl;

} double tempData[8];

//行小波分解

for( i=0;i<8;i )

{

for( j=0;j<4;j )

{

double temp1=imgData[i][2*j];

double temp2=imgData[i][2*j 1];

tempData[j]=(temp1 temp2)/2;

tempData[j 4]=(temp1-temp2)/2;

} for( j=0;j<8;j )

{

imgData[i][j]=tempData[j];

}

} //列小波分解

for( i=0;i<8;i )

{

for( j=0;j<4;j )

{

double temp1=imgData[2*j][i];

double temp2=imgData[2*j 1][i];

tempData[j]=(temp1 temp2)/2;

tempData[j 4]=(temp1-temp2)/2;

}

for( j=0;j<8;j )

{

imgData[j][i]=tempData[j];

}

}

cout<<"1级小波分解数据"<<endl;

for( i=0;i<8;i )

{

for( j=0;j<8;j )

{

cout<<imgData[i][j]<<" ";

}

cout<<endl;

}

//列小波逆分解

for( i=0;i<8;i )

{

for( j=0;j<4;j )

{

double temp1=imgData[j][i];

double temp2=imgData[j 4][i];

tempData[2*j]=temp1 temp2;

tempData[2*j 1]=temp1-temp2;

} for( j=0;j<8;j )

{

imgData[j][i]=tempData[j];

}

} //行小波逆分解

for( i=0;i<8;i )

{

for( j=0;j<4;j )

{

double temp1=imgData[i][j];

double temp2=imgData[i][j 4];

tempData[2*j]=temp1 temp2;

tempData[2*j 1]=temp1-temp2;

}

for( j=0;j<2*4;j )

{

imgData[i][j]=tempData[j];

}

} cout<<"1级小波逆分解数据"<<endl;

for( i=0;i<8;i )

{

for( j=0;j<8;j )

{

cout<<imgData[i][j]<<" ";

}

cout<<endl;

}

return 0;

}

(4)一个应用:利用小波变换进行图像压缩

Haar小波在图像处理和数字水印等方面应用较多,这里介绍下利用小波变换进行图像压缩。

我们知道,图像压缩就是要寻找高压缩比、并使压缩后的图像有合适的信噪比的方法,对压缩后的图像还要能实现低失真度地恢复图像。压缩性能的评价标准之一是图像能量损失和零系数成分值。能量损失越小,零系数成分值越大,图像压缩的性能就越高。

小波图像压缩的特点是压缩比高,压缩速度快,能量损失低,能保持图像的基本特征,且信号传递过程抗干扰性强,可实现累进传输。

根据 “(1)图像/矩阵进行Haar小波的基本原理”中介绍的不同分辨率下小波变换系数的那种塔式层次模型,我们可以得到以下三种简单的图像压缩方案。

方案一:舍高频,取低频

一幅图像最主要的表现部分是低频部分,因此我们可以在小波重构时,只保留小波分解得到的低频部分,而高频部分系数作置0处理。这种方法得到的图像能量损失大,图像模糊,很少采用。

另外,也可以对高频部分的局部区域系数置0,这样重构的图像就会有局部模糊、其余清晰的效果。

方案二:阈值法

对图像进行多级小波分解后,保留低频系数不变,然后选取一个全局阈值来处理各级高频系数;或者不同级别的高频系数用不同的阈值处理。绝对值低于阈值的高频系数置0,否则保留。用保留的非零小波系数进行重构。Matlab中用函数ddencmp()可获取压缩过程中的默认阈值,用函数wdencmp()能对一维、二维信号进行小波压缩。

方案三:截取法

将小波分解得到的全部系数按照绝对值大小排序,只保留最大的x %的系数,剩余的系数置0。不过这种方法的压缩比并不一定高。因为对于保留的系数,其位置信息也要和系数值一起保存下来,才能重构图像。并且,和原图像的像素值相比,小波系数的变化范围更大,因而也需要更多的空间来保存。

===============

感谢大家的支持,由于时间太紧(经常加班到很晚),很多地方大嘴只能大概介绍,会较广,但未必很细,这里只给您指出知识的一个方向,至于深度上,还请大家根据感兴趣的文章多搜集资料,大嘴也在不断学习中,一起努力吧!

===============

声明:

本微信公众号(本微博)所发表的内容均为非营利性,不用于任何商业用途。大嘴所发文章中的部分文字及大多数图片均来自互联网,如果您认为大嘴侵犯到了您的版权,请联系大嘴,大嘴会及时删除相关内容。

「大嘴说图像」 内容涵盖计算机图像处理、模式识别、计算机视觉、智能交通、安防等领域的相关知识。其中,既有大嘴的原创,也有大嘴多年来收集和整理的资料。在创作、筛选文章的同时,大嘴也得以再一次巩固、沉淀上述知识。自娱自乐之外,如果能为您打开一扇了解计算机图像处理相关知识的大门,大嘴将不胜荣幸!对本公众号如有任何意见或建议,请直接发微信与大嘴联系。

欢迎关注同名微信公众号"大嘴说图像",头像为微信二维码。

(1)我的新浪微博http://weibo.com/cvchina2dazuiimage

(2)新浪博客http://blog.sina.com.cn/cvchina2dazuiimage

(3)微信公众号“大嘴说图像”

尽可能保证每天至少一篇文章,希望和大家一起努力,并通过网络结识更多的业内朋友和图像爱好者。

感谢您对大嘴的支持和信任!

大嘴QQ:2091589652

QQ群:179042731(北京图像视觉技术交友),招募全国各地的业内爱好者以及志同道合的朋友中!

本QQ群宗旨:图形学/图像处理/机器视觉/模式识别行业爱好者交流、交友及聚会。

群主大嘴以及管理员们将在北京不定期举行群内好友聚会,聚会方式:喝酒、品茶、爬山以及所有正能量活动,在现实中和朋友们交流学习、生活和工作,互相解决问题。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有