DWT与图像转换——Python和Matlab实现(完整解析版)

该实验详细介绍了如何使用Python实现离散小波变换(DWT)进行图像转换,包括图像的多层分解、频率成分重构以及压缩。此外,还涉及到了水印嵌入和提取的方法,通过对比和PSNR计算展示嵌入前后图像质量。实验中使用了Python的OpenCV和PyWavelets库来处理图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

仿射密码实验-Python实现
DES密码实验-C语言实现
VQ压缩与信息隐藏——Matlab和Python实现
仿射密码实验——Python实现(完整解析版)
MD5密码实验——Python实现(完整解析版)
LSB信息隐藏——Python实现(完整解析版)



实验目的

1)了解DWT
2)掌握DWT与图像转换的实现

实验方法

根据给出的DWT与图像转换算法的描述,用所熟悉的语言,完成实验内容并简要描述实验操作步骤。

实验环境

计算机语言:python
开发环境:vscode

实验内容与操作步骤

1.根据给出的DWT算法,完成基于DWT的图像转换。

如图所示
在这里插入图片描述

而基于小波变换的图像压缩基本步骤如下:

①用小波对图像层分解并提取分解结构中的低频和高频系数

②各频率成分重构

③对第一层低频信息压缩

④对第二层低频信息压缩

2.思考新的图像转换方法,解决基于DWT的图像转换方法的条状视觉缺点。描述相关方法,并实现。

嵌入

将载体图像进行二级离散小波变换得到三级分辨率级下的多个个细节子图,取cH2,cV2,cD2和一个逼近子图cA,水印图像进行一级离散小波变换得到一级分辨率下的一个逼近子图ca和三个细节子图chl,cvl,cd1,再进行计算并重构图像。

提取

将原载体图像进行二级离散小波变换得到三级分辨率级下的多个个细节子图,取cH2,cV2,cD2和一个逼近子图cA,嵌入后的载体图像进行二级离散小波变换得到一级分辨率下的一个逼近子图ca和三个细节子图chl,cvl,cd1,再计算并重构水印图像。

实验步骤

1.

读取原始图像和待嵌入图像
在这里插入图片描述

后进行离散小波变换

在这里插入图片描述

2.

嵌入:将载体图像进行二级离散小波变换得到三级分辨率级下的多个个细节子图,取cH2,cV2,cD2和一个逼近子图cA,水印图像进行一级离散小波变换得到一级分辨率下的一个逼近子图ca和三个细节子图chl,cvl,cd1,再进行计算并重构图像。
在这里插入图片描述

提取:将原载体图像进行二级离散小波变换得到三级分辨率级下的多个个细节子图,取cH2,cV2,cD2和一个逼近子图cA,嵌入后的载体图像进行二级离散小波变换得到一级分辨率下的一个逼近子图ca和三个细节子图chl,cvl,cd1,再计算并重构水印图像。
在这里插入图片描述

实验结果

1.得出的嵌入后图像与原始图像相差无几,psnr为30.1476
在这里插入图片描述

2.代码运行
在这里插入图片描述
在这里插入图片描述

实验心得

本次实验学习了离散小波变换,了解了结合Arnold变换的基于DWT的数字水印的嵌入。充分利用了小波变换的特点,采用Haar小波,把原始图像及水印图像进行三级小波分解,然后在多分辨率分解后的频段嵌入水印信号,得到嵌入水印的图像,在解决条状视觉缺点的问题上,使用的方法为分别得到不同分辨率级下的多个细节子图和一个逼近子图、二级离散小波变换。

代码

dwt.py

import cv2
import pywt
import numpy as np
import math
from PIL import Image

def insert(img,wa_img,hid_img):
    waterImg = cv2.imread(wa_img,cv2.IMREAD_GRAYSCALE)
    Img = cv2.imread(img,cv2.IMREAD_GRAYSCALE)
    [cA,(cH2,cV2,cD2),(cH1,cV1,cD1)] = pywt.wavedec2(Img,'haar',level=2)
    [ca,(ch1,cv1,cd1)] = pywt.wavedec2(waterImg,'haar',level=1)
    cA=cA+ca*0.1
    cH2=cH2+ch1*0.1
    cV2=cV2+cv1*0.1
    cD2=cD2+cd1*0.1
    newImg = pywt.waverec2([cA,(cH2,cV2,cD2),(cH1,cV1,cD1)],'haar')
    newImg = np.array(newImg,np.uint8)
    cv2.imwrite(hid_img,newImg)
    print('嵌入成功,原始图像与嵌入后图像的PSNR峰值信噪比为:',PSNR(img,hid_img))



def draw(img,hid_img,wa_img):
    hidImg=cv2.imread(hid_img,cv2.IMREAD_GRAYSCALE)
    Img = cv2.imread(img,cv2.IMREAD_GRAYSCALE)
    [cA,(cH2,cV2,cD2),(cH1,cV1,cD1)] = pywt.wavedec2(hidImg,'haar',level=2)
    [ca,(ch1,cv1,cd1),(ch,cv,cd)] = pywt.wavedec2(Img,'haar',level=2)
    ca_w=(cA-ca)*10
    ch1_w=(cH2-ch1)*10
    cv1_w=(cV2-cv1)*10
    cd1_w=(cD2-cd1)*10
    outImg = pywt.waverec2([ca_w,(ch1_w,cv1_w,cd1_w)],'haar')
    outImg=np.array(outImg,np.uint8)
    cv2.imwrite(out_img,outImg)
    print('提取成功,原始水印图像与提取图像的PSNR峰值信噪比为:',PSNR(wa_img,out_img))

def PSNR(old,new):#计算PSNR
    old=np.array(cv2.imread(old,cv2.IMREAD_GRAYSCALE), dtype='int64')
    new=np.array(cv2.imread(new,cv2.IMREAD_GRAYSCALE), dtype='int64')
    s=0
    for i in range(len(old)):
        for j in range(len(old[i])):
            s+=(old[i][j]-new[i][j])**2
    s/=(len(old)*len(old[0]))
    psnr=10*math.log((255**2)/s)
    return psnr

if __name__ == '__main__':
    wa_img=r'outside256.tiff'
    img=r'lena_gray_512.tif'
    hid_img=r'lena_gray_512_new2.tif'
    out_img=r'outside256_new2.tif'
    while(True):
        a=input('请选择:1.嵌入,2.提取,3.退出')
        if(a=='1'):
            insert(img,wa_img,hid_img)
        elif(a=='2'):
            draw(img,hid_img,wa_img)
        else:
            break

MYDWTCT.m

clc;
clear all;
close all;
reference_image=imread('lena_gray_512.tif');
original_image=imread('outside256.tiff');
reference_image_double=double(reference_image);
original_image_double=double(original_image);
[m,n]=size(original_image_double);
[row,col]=size(reference_image_double);
hided_image_double=reference_image_double;

[CA,CH,CV,CD] = dwt2(hided_image_double,'haar'); 
for i=1:m
    for j=1:n
        CV(i,j)=fix(original_image_double(i,j)/16);
        CD(i,j)=mod(original_image_double(i,j),16);
    end
end
hided_image_double=idwt2(CA,CH,CV,CD,'haar');
hided_image=uint8(hided_image_double);
PSNR=psnr(hided_image,reference_image)

subplot(2,2,1);imshow(reference_image);title('˛ÎŐŐÍźĎń','fontname','΢ČíŃĹşÚ');
subplot(2,2,2);imshow(hided_image);title('˛ŘČëşóÍźĎń','fontname','΢ČíŃĹşÚ');

showed_image_double=zeros(m,n);
[CA,CH,CV,CD] = dwt2(hided_image_double,'haar'); 
for i=1:m
    for j=1:n
        showed_image_double(i,j)=16*CV(i,j)+CD(i,j);
    end
end
showed_image=uint8(showed_image_double);
subplot(2,2,3);imshow(showed_image);title('˛ŘČëÍźĎń','fontname','΢ČíŃĹşÚ');
subplot(2,2,4); title(['This PSNR=' num2str(PSNR)]

psnr.m

function PSNR=psnr(input,inputchange)

img=double(input);  
imgn=double(inputchange); 
[h,w]=size(img);  

%编码一个像素用多少二进制位    
B=8;   
MAX=2^B-1;         
MES=sum(sum((img-imgn).^2))/(h*w);     %均方差  
PSNR=20*log10(MAX/sqrt(MES));           %峰值信噪比

### 红外图像可见光图像的区别 红外图像可见光图像是两种基于不同物理特性的成像方式。可见光图像主要依赖于物体反射或发射的电磁波在可见光谱范围内的强度分布来形成图像[^1],而红外图像则记录的是物体辐射出的热能信息,在较长波长范围内捕捉到的数据。 两者的主要区别如下: - **光源需求**:可见光成像通常需要外部光照条件良好才能获得清晰的画面;相比之下,红外成像不依赖外界光线,可以在完全黑暗的情况下工作。 - **穿透能力**:由于波长的不同,某些材料对于可见光可能是透明或者半透明状态,但对于红外线却表现为吸收特性,反之亦然。 - **应用场景**:可见光主要用于日常视觉感知以及传统摄影等领域,而红外技术广泛应用于夜视设备、温度检测、遥感监测等方面。 ### 图像之间的转换方法 关于如何实现从一种类型的图像向另一种类型转变这一过程较为复杂,并不存在直接简单的数学公式可以完成此操作。然而通过一些特定的技术手段能够间接达到目的: - 使用机器学习模型训练数据集来进行风格迁移式的转化尝试, 这种方法可能涉及到深度神经网络架构的设计优化. 例如采用GANs(生成对抗网络), 它们可以通过大量样本的学习模仿目标域特征从而生成接近真实的输出结果. 另外值得注意的一点是实际应用当中往往并不追求严格意义上的互相转换而是更关注利用各自优势互补的信息提取即所谓的多模态数据分析处理. ### 融合技术概述 为了充分利用这两种不同类型传感器所获取的信息资源, 科研人员提出了多种有效的融合策略其中包括但不限于以下几个方面: #### 基于拉普拉斯金字塔的方法 这种方法首先构建一个多尺度空间表示形式——拉普拉斯塔形结构(Laplacian Pyramid),接着分别对输入源执行相应层次上的分解运算最后再按照一定权重比例重新组合起来得到最终效果较好的合成本. ```python import numpy as np from skimage.transform import pyramid_laplacian def laplacian_pyramid_fusion(image1, image2): levels = 5 pyr_image1 = tuple(pyramid_laplacian(image1, max_layer=levels)) pyr_image2 = tuple(pyramid_laplacian(image2, max_layer=levels)) fused_pyr = [] for i in range(levels + 1): fused_pyr.append((pyr_image1[i] + pyr_image2[i]) / 2) reconstructed = sum(fused_pyr) return np.clip(reconstructed, 0, 1) ``` #### 小波变换为基础的方式 小波分析提供了另一个强有力的工具用于解决此类问题因为它不仅可以很好地保持边缘细节而且还能有效减少噪声干扰等因素的影响程度. ```matlab function fusedImage = waveletFusion(irImage, visImage) % WAVELETFUSION performs fusion using discrete wavelet transform (DWT). [Cir,Sir]=wavedec2(double(irImage),3,'db1'); [Cvis,Svis]=wavedec2(double(visImage),3,'db1'); CA=Cir; CH=Cir(Sir(1)+1:Sir(1)+Sir(2)); CV=Cir(Sir(1)+Sir(2)+1:end-Sir(end)); CDH=Cvis(Svis(1)+1:Svis(1)+Svis(2)); CDV=Cvis(Svis(1)+Svis(2)+1:end-Svis(end)); Cfus=[CA;max(abs(CH),abs(CDH));max(abs(CV),abs(CDV))]; fusedImage=waverec2(Cfus,Sir,'db1'); end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值