基于DWT-DCT-SVD的图像数字水印算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、算法原理

二、结果

总结



前言

提示:这里可以添加本文要记录的大概内容:

  1. 数字水印技术作为知识产权保护及认证的重要手段,正得到广泛研宄与应用。数字水印技术是在数字产品中嵌入秘密信息,以便保护产品的版权、证明产品的真实可靠性、跟踪盗版行为或提供产品的附加信息。这个秘密信息被称为数字水印。本文通过基于 DWT-DCT-SVD 数字水印算法,首先对载体图像进行2级小波分解,在HH2分量上进行分块,再结合DCT和SVD技术嵌入水印,该算法具有更好的不可见性和鲁棒性。

提示:以下是本篇文章正文内容,下面案例可供参考

一、算法原理

  1. 离散小波变换算法

图像的离散小波变换一般是通过二维小波变换来实现,小波变换的过程如下图1所示,首先它将图像数据分割成若干个行与列组成的矩阵,对图像的每一行做一维小波变换获得原始图像在水平方向上的低频分量L和高频分量H,然后变换所得数据的每一列做一维的小波变换,经过变换之后图像就被分解成左上角的相似的一部分LL1,左下角垂直方向的细节部分 LH1,右上角水平方向的细节部分HL1,右下角对角线方向的细节部分 HH1,再对其中相似部分LL1再进行一级分解,从而实现图像的二级分解。

通对过两次分解后的图像多分辨率特点进行分析可得,图像多分辨率在空间方向具有很好的选择性,与人类的通过视觉来获取事物的特性过程十分吻合。因此,一般把集中原始图像绝大多数能量的相似部分称为逼近子图。子带图像的左上角细节部分、右上角的细节部分和右下角细节部分分别刻画了原始图像的边缘、轮廓和纹理细节等特征,并都将它们称为细节子图。逼近子图由于保留了原始图像的大部分内容,使其更不容易受到外界影响,具有较强的抗干扰性,稳定性也相对较好而边缘细节子图保留原始图像的细节较少,更则容易受外来噪声、图像处理的攻击,稳定性也较差。

2.离散余弦变换算法

离散余弦变换作为数字信号处理领域最常用的算法之一,也可以同傅里叶变换一样实现快速算法。由于避免了傅里叶变换中的复数运算,离散余弦变换通过实数的正交变换使得计算的速度得到了很大的提升,同时也能够实现很好的能量压缩和去相关的能力,因此该算法在图像压缩领域和数字音频信号压缩等领域都有着普遍的应用。增强水印的抗压缩能力可以通过压缩标准模型的水印嵌入算法来实现,因此,研究离散余弦变换对于数字水印处理技术有着显著的意义。特别是实现离散余弦变换后使得能量集中,同时算法并不复杂,因此可以更容易在数字信号处理器中快速实现。

图像离散余弦变换(DCT) 公式如下:

 式中: F(u,v)为离散余弦函数,f(x,y)为图像原始数据。

3.奇异值分解算法

奇异值分解( Singular Value Decomposition) 是矩阵分析应用中一种非常重要的分解方法,尤其是正规矩阵酉对角化在信号处理、数字图像处理、统计学等领域占有重要位置,应用非常广泛。奇异值分解具有转置不变性、旋转不变性、位移不变性以及镜像变换不变性等重要性质,使得奇异值特征在描述图像时更具稳定性。当图像被施加小的扰动时,图像的奇异值不会有很大的变化,而且奇异值所表现的是图像的内蕴特性而非视觉特性,反映的是图像矩阵元素之间的关系。SVD通常用来提取图像的特征值,实现降维、图像压缩。在数字水印技术中,也可以用来提高水印的鲁棒性。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、结果

                                                 未受攻击时的实验结果

                                 高斯滤波攻击时的实验结果

                                旋转20度攻击时的实验结果 


总结

本文的DWT-DCT-SVD数字水印算法,基于DCT和DWT的各自优势,采用DWT和DCT相结合的方法进行嵌入数字水印,DWT将水印嵌在图像的低频部分,保证水印的鲁棒性。而DCT以把图像重要的可视信息都集中在变换后的小部分系数中可以提升图像水印的不可见性。

该算法效果还可以,但存在一些不足。在实际应用场景中,为保证水印图像的安全性,还需要在嵌入数字水印的过程中加入密钥,防止无关人员恶意提取水印。同时,在选择嵌入块时,可以采用计算小波系数块信息熵与周围系数块信熵值波动最小的方法选择最优嵌入块,以提高数字水印的鲁棒性。 

M = 512; % 原图像长度
N = 64; % 水印图像长度
K = 32; % 子块大小

alpha=0.1;% 嵌入强度系数

% 打开原图、水印图
I = imread('lena.jpg');
G = imread('a.jpg');
%W = zeros(M);

% 缩放、灰度化原图、改变精度
I = imresize(I,[M M]);
%I = im2double(I); % double精度转换
I = rgb2gray(I); % 灰度化处理

G = imresize(G,[N N]);
%G = im2double(G); % double精度转换
G = rgb2gray(G); % 灰度化处理

subplot(2,2,1);
imshow(I);
title('原始载体图片');
subplot(2,2,2);
imshow(G);
title('原始水印图像');

%Step 1
[LL,LH,HL,HH] = dwt2(G,'haar'); % 进行2维哈尔离散小波变换
[U,S,V] = svd(HH);% 对HH进行SVD分解,得到U、S、V矩阵

%Step 2
%进行2级离散小波变换
[LL1, LH1, HL1, HH1] = dwt2(I, 'haar');
[LL2, LH2, HL2, HH2] = dwt2(LL1, 'haar');%128*128
H0 = entropy(HH2)% 计算HH3系数的信息熵

%Step 3

%选出最优嵌入块 默认为4*4:(1,1)
optimal_block_index = 0;

%Step 4
%对最优嵌入块进行 DCT 变换,得到DCT系数矩阵 B
m = floor(optimal_block_index/4)+1;
n = mod(optimal_block_index, 4)+1
x = (m - 1) * K + 1;
y = (n - 1) * K + 1;
H_I = HH2(x:x+K-1, y:y+K-1);
B = dct2(H_I);

%Step 5
%对B进行奇异值分解,嵌入水印
[U1,S1,V1] = svd(B);
S2 = S1 + alpha * S;
B1 = U1 * S2 * V1;
H_I = idct2(B1);
HH2(x:x+K-1, y:y+K-1) = H_I;
LL1 = idwt2(LL2,LH2,HL2,HH2,'haar');
W = idwt2(LL1,LH1,HL1,HH1,'haar');
W = uint8(W);

%攻击
%高斯滤波攻击
%H = fspecial('gaussian',3,0.4);
%W = imfilter(W,H);

%G 压缩攻击
%quality = 50;
%W = imresize(W, 0.5); % 缩小图像
%imwrite(W, 'temp.jpg', 'Quality', quality); % 保存为JPEG格式
%W = imread('temp.jpg'); % 重新读取JPEG图像
%W = imresize(W, 2); % 放大图像

% 剪切攻击
%r = 0.3; % 剪切比例为30%
%sz = size(W);
%h1 = round(sz(1)*r); % 剪切高度
%w1 = round(sz(2)*r); % 剪切宽度
%x1 = round(rand(sz(1)-h1)); % 随机选择一行
%y1 = round(rand(sz(2)-w1)); % 随机选择一列
%W(x1+1:x1+h1, y1+1:y1+w1) = 0; % 将指定区域置为0

% 旋转攻击
%angle = 20; % 旋转角度为20度
%W = imrotate(W, angle, 'bilinear', 'crop');

%提取水印
[LL3, LH3, HL3, HH3] = dwt2(W, 'haar');
[LL4, LH4, HL4, HH4] = dwt2(LL3, 'haar');%128*128
H_I2 = HH4(x:x+K-1, y:y+K-1);
B2 = dct2(H_I2);
[Uw,Sw,Vw] = svd(B2);
Sx = (Sw - S1)/alpha;
B2 = U * Sx * V;
H_I2 = idct2(B2);
A = idwt2(LL,LH,HL,H_I2,'haar');
A = uint8(A);
subplot(2,2,3);
imshow(W);
title('嵌入水印后的载体图像');
subplot(2,2,4);
imshow(A);
title('提取出来的水印图像');

% 计算PSNR值
psnr_val = psnr(G, A);

% 显示PSNR值
fprintf('The PSNR value between the original image and reconstructed image is %f.\n', psnr_val);

% 计算直方图
h1 = imhist(G);
h2 = imhist(A);

% 根据直方图计算 NC 值
nc_val = sum(sqrt(h1 .* h2)) / sqrt(sum(h1) * sum(h2));

% 显示 NC 值
fprintf('The NC value between the two images is %f.\n', nc_val);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值