前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小波变换二之Haar变换

小波变换二之Haar变换

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 09:36:33
2.5K0
发布2019-01-22 09:36:33
举报

Haar变换

这是小波变换的第二篇,我们继续谈Haar变换。在第一篇中,我们介绍了一位情况下的Haar变换,这篇博文中主要介绍二维Haar变换。最后,通过一个图像压缩的案例说明二维Haar变换的应用。

原理说明

给定一个二维信号,我们这里假设是一个4×44\times44×4的图片,

f=[21567658215577210]f=\begin{bmatrix}2&1&5&6\\7&6&5&8\\2&1&5&5\\7&7&2&10\end{bmatrix}f=⎣⎢⎢⎡​2727​1617​5552​68510​⎦⎥⎥⎤​

如何进行二维的哈尔变换呢?

步骤是这样的:(1)首先,沿着矩阵的每一行做一维的Haar变换;(2)然后,沿着矩阵的每一列做一维的哈尔变换;(3)对于每个低频分量矩阵(近似信息)重复步骤(1)和(2)直到完成指定的等级划分。下图给出了两级划分的示意图:

二维Haar变换示意图
二维Haar变换示意图

这里的A表示近似信息(approximation coefficients),H表示水平细节信息(horizontal detail coefficients),V表示垂直细节信息(vertical detail coefficients),D表示对角线细节信息(diagonal detail coefficients)。很多数学软件中是这样称呼的,了解了这个可以帮助我们快速上手软件进行实际操作。

行分解和列分解的顺序是可以互换的,保持一致即可。

明白了基本原理,下面我们来进行实际计算,对于fff,(如果不清楚如何做一维高频和低频分解,可参看博文《小波变换一之Haar变换》

第一次行分解得到低频信息L=[3211213213232527262]L=\begin{bmatrix}\frac{3}{\sqrt{2}}&\frac{11}{\sqrt{2}}\\\frac{13}{\sqrt{2}}&\frac{13}{\sqrt{2}}\\\frac{3}{\sqrt{2}}&5\sqrt{2}\\7\sqrt{2}&6\sqrt{2}\end{bmatrix}L=⎣⎢⎢⎢⎡​2​3​2​13​2​3​72​​2​11​2​13​52​62​​⎦⎥⎥⎥⎤​

第一次列分解得到高频信息H=[12−1212−321200−42]H=\begin{bmatrix}\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}}\\\frac{1}{\sqrt{2}}&-\frac{3}{\sqrt{2}}\\\frac{1}{\sqrt{2}}&0\\0&-4\sqrt{2}\end{bmatrix}H=⎣⎢⎢⎢⎡​2​1​2​1​2​1​0​−2​1​−2​3​0−42​​⎦⎥⎥⎥⎤​

对LLL进行列高频分解得到A1=[8128.511]A_1=\begin{bmatrix}8&12\\8.5&11\end{bmatrix}A1​=[88.5​1211​]

对LLL进行列低频分解得到H1=[−5−1−5.5−1]H_1=\begin{bmatrix}-5&-1\\-5.5&-1\end{bmatrix}H1​=[−5−5.5​−1−1​]

对HHH进行列高频分解得到V1=[1−20.5−4]V_1=\begin{bmatrix}1&-2\\0.5&-4\end{bmatrix}V1​=[10.5​−2−4​]

对HHH进行列低频分解得到D1=[010.54]D_1=\begin{bmatrix}0&1\\0.5&4\end{bmatrix}D1​=[00.5​14​]

我们还可以对A1A_1A1​继续进行二层分解,这里就不做演示了。

实例演示

这里我们通过对一张图片做Haar变换,然后我们去掉其高频信息部分,实现对图像的压缩。

下面是进行了三次分解,然后分别过了到第一层的高频信息和第一层兼第二层的高频信息的效果!过滤掉第一层的高频信息,图像压缩为原来的四分之一,可以看到图像还是基本清晰的。过滤掉第二层和第二层的高频信息以后,可以看到图片稍微有点模糊了。

Haar变换实现图像压缩
Haar变换实现图像压缩

MATLAB实现

下面是使用MATLAB实现上面变换的代码,有兴趣的童鞋可以参考一下。

代码语言:javascript
复制
clear, clc;

% 读取原始图像
X = rgb2gray(imread('http://www.lenna.org/lena_std.tif'));
% 进行小波分解
[C, S] = wavedec2(X, 3, 'haar');

% 获得分解以后的低频近似信息
L = appcoef2(C, S, 'haar', 3);
% 分别获得各层级的高频细节信息
[H3, V3, D3] = detcoef2('all', C, S, 3);
[H2, V2, D2] = detcoef2('all', C, S, 2);
[H1, V1, D1] = detcoef2('all', C, S, 1);

% 去掉第一层的高频信息(替换成0),然后进行小波重建
% 注意这里乘以3是有HVD三种高频信息
D = [C(1: end - 3*size(H1, 1)*size(H1, 2)), zeros(1, 3*size(H1, 1)*size(H1, 2))];
CD1 = waverec2(D, S, 'haar');
% 去掉第一和第二层的高频信息,然后进行小波重建
D = [C(1: end - 3*size(H1, 1)*size(H1, 2) - 3*size(H2, 1)*size(H2, 2)), ...
    zeros(1, 3*size(H1, 1)*size(H1, 2) + 3*size(H2, 1)*size(H2, 2))];
CD2 = waverec2(D, S, 'haar');

%按照分解层级将分解系数排列拼接为一副图像
DD1 = [L, H3; V3, D3];
DD2 = [DD1, H2; V2, D2];
DD3 = [DD2, H1; V1, D1];
% 结果显示
subplot(2, 2, 1), imshow(X, []), title('原始图像');
subplot(2, 2, 2), imshow(DD3, []), title('小波分解系数');
subplot(2, 2, 3), imshow(CD1, []), title('压缩一(去掉第一层高频信息)');
subplot(2, 2, 4), imshow(CD2, []), title('压缩二(去掉第二层高频信息)');
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Haar变换
    • 原理说明
      • 实例演示
        • MATLAB实现
        相关产品与服务
        图像处理
        图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档