专栏首页给永远比拿愉快小波变换二之Haar变换

小波变换二之Haar变换

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)直到完成指定的等级划分。下图给出了两级划分的示意图:

这里的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变换,然后我们去掉其高频信息部分,实现对图像的压缩。

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

MATLAB实现

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

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('压缩二(去掉第二层高频信息)');

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python求解正态分布置信区间

    正态分布(Normal Distribution)又叫高斯分布,是一种非常重要的概率分布。其概率密度函数的数学表达如下:

    卡尔曼和玻尔兹曼谁曼
  • Leetcode: Set Matrix Zeroes

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to...

    卡尔曼和玻尔兹曼谁曼
  • C++结构体前面为什么会经常使用typedef

    为什么struct关键字后面有结构体名称student了,还需要用typedef再重新给定一个名字呢?

    卡尔曼和玻尔兹曼谁曼
  • NodeX Component - 滴滴集团 Node.js 生态组件体系

    小编推荐:"NodeX Component 是滴滴金融泛前端和普惠出行泛前端联手打造的,面向滴滴集团生态内产出的 Node.js 组件生态合集,融汇贯通了滴滴集...

    五月君
  • 大会活动|剧透 - 5月21日,腾讯优图的暖科技在昆明等你!

    5月21日-23日,由云南省人民政府指导,云南省文化和旅游厅、昆明市人民政府、腾讯公司共同主办的腾讯全球数字生态大会即将在昆明举办,这是腾讯战略升级后打造的规格...

    优图实验室
  • 3-weka.filters.unsup

    py3study
  • 产品资讯|2020年,让我们继续“AI”在一起

    优图实验室
  • 深入浅出XTTS:Oracle数据库迁移升级利器

    摘要 通常我们要进行数据迁移,可以使用的方案有很多,比如数据泵、RMAN、GoldenGate,甚至是第三方同步软件DSG、DDS等。但是对于传统的迁移方式来说...

    IT大咖说
  • ES 7.8 速成笔记(上)

    下载地址: https://www.elastic.co/cn/downloads/elasticsearch (目前最新版本为7.8)

    菩提树下的杨过
  • 【OCP最新题库解析(052)--题48】When would you use memory advisors?

    该系列专题为2018年4月OCP-052考题变革后的最新题库。题库为小麦苗解答,若解答有不对之处,可留言,也可联系小麦苗进行修改。

    小麦苗DBA宝典

扫码关注云+社区

领取腾讯云代金券