系列文章目录
仿射密码实验-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)); %峰值信噪比