二维图像haar小波变换的分解与重构

二维离散小波的理论推导和一维小波类似,但是以其尺度函数生成的尺度函数集作为标准正交基的尺度空间Vi的正交补空间Wi不能直接得到,而是可以证明,正交补空间Wi是由三个子空间的直和组成,对应的三个子空间可以由作为正交基的尺度函数、小波函数张成。

二维离散小波变换对图像的分解可以看做如下图所示的滤波过程,即首先进行行滤波,沿着列方向进行,然后下采样,然后对上一步得到的结果进行列滤波,沿着行方向,然后下采样,做完所有的列滤波后,获得4个不同的频带,一个近似分量、三个细节分量(水平、垂直、对角线),将所有的结果组合为一张图。

若对所得的近似分量继续进行这样的滤波过程,既可以得到如下图所示的塔式分解:



注意这里有个坑,python cv2对于float类型会乘以255,导致近似分量会显示为白图,需要使用pyplot进行显示。重构出来的图像如下图所示:

haar代码如下:

import numpy as np
import matplotlib.image as mpimg # mpimg 用于读取图片
import matplotlib.pyplot as pltL_D = np.array([0.7071,   0.7071])
H_D = np.array([-0.7071,  0.7071])
L_R = np.array([0.7071,   0.7071])
H_R = np.array([0.7071,  -0.7071])QP = 20
threshold = 5
#这里的图像是整张图像,height、width是整张图像大小
def haar_decomposition(img, height, width, depth):img_h = np.zeros((height , width ))img_l = np.zeros((height , width ))img_l_l = np.zeros((height , width)) #近似系数,左上img_l_h = np.zeros((height , width)) #细节系数,垂直方向,左下img_h_l = np.zeros((height , width)) #细节系数,水平方向,右上img_h_h = np.zeros((height , width)) #细节系数,对角线,右下img_new = np.zeros((height , width)) depth_count = 1;while depth_count <= depth:if depth_count != 1:width = width // 2height = height // 2#行滤波#行间滤波,然后进行下采样for i in range(0, height // 2, 1):for j in range(0, width, 1):    i_endflag = 1 if i + 1 < height // 2 else -1img_l[i][j] = ((L_D[0] * img[i * 2][j] + L_D[1] * img[i * 2 + i_endflag][j]) // QP) * QPimg_h[i][j] = ((H_D[0] * img[i * 2][j] + H_D[1] * img[i * 2 + i_endflag][j]) // QP) * QPn_w = width // 2n_h = height // 2#列滤波,列间滤波,沿着行for i in range(0, height // 2, 1):for j in range(0, width // 2, 1):j_endflag = 1 if j + 1 < width // 2 else -1img_l_l[i][j]             = ((L_D[0] * img_l[i][j * 2] + L_D[1] * img_l[i][j * 2 + j_endflag]) // QP) * QPimg_l_h[n_h + i][j]       = ((H_D[0] * img_l[i][j * 2] + H_D[1] * img_l[i][j * 2 + j_endflag]) // QP) * QPimg_h_l[i][n_w + j]       = ((L_D[0] * img_h[i][j * 2] + L_D[1] * img_h[i][j * 2 + j_endflag]) // QP) * QPimg_h_h[n_h + i][n_w + j] = ((H_D[0] * img_h[i][j * 2] + H_D[1] * img_h[i][j * 2 + j_endflag]) // QP) * QPif depth_count == depth:img_new = img_new + img_l_l + img_l_h + img_h_l + img_h_helse:img_new = img_new + img_l_h + img_h_l + img_h_himg = img_l_l.copy()img_l[:][:] = 0img_h[:][:] = 0img_l_l[:][:] = 0    img_l_h[:][:] = 0img_h_l[:][:] = 0img_h_h[:][:] = 0depth_count += 1 img_new = np.round(img_new)return img_new#这里的图像是整张图像,height、width是原始图像大小
def haar_reconstruction(img, height, width, trans_num):img_h = np.zeros((height , width ))img_l = np.zeros((height , width ))img_l_l = np.zeros((height , width))img_l_h = np.zeros((height , width))img_h_h = np.zeros((height , width))img_h_l = np.zeros((height , width))img_new = np.zeros((height , width)) depth_count = 1;min_width  = width  // ( 2 ** trans_num )min_height = height // ( 2 ** trans_num )cur_width =  min_widthcur_height = min_heightwhile depth_count <= trans_num:if depth_count != 1:cur_width  = cur_width * 2cur_height = cur_height * 2#列上采样for i in range(cur_height):for j in range(cur_width):img_l_l[i][2*j] = img[i][j]img_l_h[i][2*j] = img[cur_height + i][j]img_h_l[i][2*j] = img[i][cur_width + j]img_h_h[i][2*j] = img[cur_height + i][cur_width + j]#列滤波,列间滤波,沿着行for i in range(cur_height):for j in range(2 * cur_width):j_endflag = 1 if j + 1 < 2 * cur_width else -1img_l_l[i][j] = L_R[0] * img_l_l[i][j] + L_R[1] * img_l_l[i][j + j_endflag]img_l_h[i][j] = H_R[0] * img_l_h[i][j] + H_R[1] * img_l_h[i][j + j_endflag]img_h_l[i][j] = L_R[0] * img_h_l[i][j] + L_R[1] * img_h_l[i][j + j_endflag]img_h_h[i][j] = H_R[0] * img_h_h[i][j] + H_R[1] * img_h_h[i][j + j_endflag]for i in range(cur_height):for j in range(2 * cur_width):img_l[i][j] = img_l_l[i][j] + img_l_h[i][j]img_h[i][j] = img_h_l[i][j] + img_h_h[i][j]#行上采样for i in range(cur_height - 1, -1, -1):for j in range(2 * cur_width):img_l[2 * i][j] = img_l[i][j]img_h[2 * i][j] = img_h[i][j]if i != 0:img_h[i][j]     = 0img_l[i][j]     = 0#行滤波for j in range(2 * cur_width):for i in range(2 * cur_height):i_endflag = 1 if i + 1 < 2 * cur_height else -1img_l[i][j] = L_R[0] * img_l[i][j] + L_R[1] * img_l[i + i_endflag][j]img_h[i][j] = H_R[0] * img_h[i][j] + H_R[1] * img_h[i + i_endflag][j]img_new = img_l + img_h    img_new = np.round(img_new)img_new = np.clip(img_new, 0, 255)    for i in range(2 * cur_height):for j in range(2 * cur_width):img[i][j] = img_new[i][j]img_l[:][:] = 0img_h[:][:] = 0img_l_l[:][:] = 0    img_l_h[:][:] = 0img_h_l[:][:] = 0img_h_h[:][:] = 0depth_count += 1      return img_newdef calc_psnr(img_reco, img_org):data1 = np.round(img_reco)data2 = np.round(img_org)data1 = np.clip(data1, 0, 255)data2 = np.clip(data2, 0, 255)mse = np.mean((data1 - data2) * (data1-data2))# print(mse)return 10 * np.log10(255*255.0/mse)# 统计零值占比
def calc_percent(img):count = 0height = img.shape[0]width = img.shape[1]for i in range(height):for j in range( width):if img[i, j] == 0:count += 1percent = count / 256 / 256return percentdef main():img = mpimg.imread("LENA.BMP")img = img.copy()trans_num = 1#img_st, 存储小波变换后的图像img_st = haar_decomposition(img, img.shape[0], img.shape[1], trans_num)plt.xticks([])plt.yticks([])plt.imshow(img_st, cmap='gray')plt.show()per = calc_percent(img_st)img_re = haar_reconstruction(img_st, img.shape[0], img.shape[1], trans_num)mse = calc_psnr(img, img_re)plt.imshow(img_re, cmap='gray')plt.show()print(mse)print(per)if __name__ == "__main__":main()

二维图像haar小波变换的分解与重构相关推荐

  1. 图像Haar小波变换

    说起小波变换就需要提起傅里叶变换.傅里叶变换就是把波进行分解,可以认为任意一个周期波都可以有足够多的正弦(余弦)波组成,这里足够多的正弦波对应的频率不同,把这些足够的正弦波放在频域中,就是傅里叶变换, ...

  2. 时间序列转二维图像方法及其应用研究综述

    目录 1 前言 2 方法综述 2.1 时频分析法 2.1.1 短时傅里叶变换 2.1.2 小波变换 2.1.3 希尔伯特-黄变换 2.2 图像编码方法 2.2.1 格兰姆角场 2.2.2 马尔可夫转移 ...

  3. 二维图像的傅立叶变换

    摘要:二维图像的傅立叶变换,与一维傅立叶相比,在理解上要抽象很多.我在网上找了几篇相对较好的文章,并用matlab自己做了几个实验图像,希望能对大家理解二维图像的傅立叶变换有所帮助. 关键字:二维傅立 ...

  4. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  5. python怎么画简单图片-Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

  6. 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )

    文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...

  7. python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例

    本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作.分享给大家供大家参考,具体如下: 二维图像卷积运算 一 代码 import numpy as np from scipy i ...

  8. 拉普拉斯算子属于卷积方法吗_二维图像中的Laplace算子和图论中的Laplacian矩阵...

    最近在阅读 如何理解 Graph Convolutional Network(GCN)?​www.zhihu.com 接触到了图论中的Laplacian矩阵,定义为 , 是Laplacian矩阵, 是 ...

  9. 程序员用「美貌」突破二维图像的人脸识别

    GitChat 作者:于航 原文: 如何利用"女装术"突破基于二维图像的人脸识别 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 首先声明,这 ...

最新文章

  1. 【SLAM后端】—— ceres优化相机位姿求解
  2. http://www.cnblogs.com/zuowj/p/5674615.html
  3. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...
  4. 苹果如何不显示云服务器照片,苹果云端照片怎么恢复到相册-互盾苹果恢复精灵...
  5. python progressbar 多行_使用单击.progressbar在Python中使用多处理
  6. SQL反模式笔记7——多列属性
  7. WebBrowser控件打开https站点
  8. bzoj1491: [NOI2007]社交网络
  9. 李焕英 照片动起来了?B站 up主用AI还原动态影像
  10. GPS各种地图坐标系转换(转载)
  11. 20200703每日一句
  12. 淘宝小程序开发demo下载
  13. iphone html5 模板,聊聊IPHONE6分辨率与适配
  14. 迅雷方舟与花瓣:不一样的“瀑布流”
  15. 剪映导出帧率选多少_视频发朋友圈更清晰的四点小技巧
  16. 使用 Datagrip 导入 Excel 数据表
  17. 人工智能的前景 | 钱颖一对话张首晟、饶毅、马化腾
  18. 【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现
  19. 电子签名行业2017新风向
  20. 【安装+配置】Mac服务端svn

热门文章

  1. JavaSwing人事管理系统(Java课程设计)
  2. 华为状态码解析2021(旧版官网)
  3. openFegin传参
  4. CloudFoundry User Account and Authentication (UAA) Server Approvals
  5. 欢迎参加 2015 Autodesk 产品开发培训课程 (2015/8/17开始)
  6. JAVA面向对象编程——描述一个人类(有姓名、年龄、生日等属性),并继承出子类
  7. 全国青少年软件编程等级考试内容,知识点思维导图(Scratch编程二级)
  8. 小孩子语录——庆祝六一儿童节
  9. 谷歌TensorFlow团队:如何利用人工智能训狗?
  10. max3232ese_MAX3232ESE收发器