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

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

系列文章目录

仿射密码实验-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));           %峰值信噪比

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值