【图像隐写】LSB算法数字水印嵌入攻击提取(含直方图)【含Matlab源码 3877期】

本文详细介绍了数字水印的两种主要嵌入技术——空间域和变换域,以LSB和小波变换为例,并通过Matlab实现。作者还讨论了PSNR作为评价指标,对比了不同方法的优缺点。

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

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
在这里插入图片描述
🔊博主简介:985研究生,Matlab领域科研开发者;

🚅座右铭:行百里者,半于九十。

🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式

更多Matlab图像处理仿真内容点击👇
Matlab图像处理(进阶版)

⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!

⛄一、数字水印嵌入提取

摘要:重点介绍数字水印的嵌入与提取算法。数字水印根据水印的嵌入技术不同分为空间域数字水印和变换域数字水印。将分别介绍数字水印的空间域算法和变换域算法,并结合图像质量评价参数峰值信噪比(PSNR)分析这两种算法的优缺点。

1 引言
随着互联网的普及和数字技术的广泛应用,数字产品变得极大丰富并且传播便捷,同时版权保护问题也日益突出。传统的信息安全技术在数字产品版权保护方面存在的不足,促成了数字水印技术的发展。数字水印技术将数字水印隐藏于数字媒体中,以便在版权纠纷中为版权所有者提供版权证明。数字水印根据水印的嵌入技术不同分为空间域数字水印和变换域数字水印。空间域算法包含叠加法和最低有效位(LSB)图像水印法等,变换域算法包含小波变换法等。实验部分使用Matlab软件进行,并分别用这三种方法对图像数字水印进行嵌入与提取。最后在相同的水印信号条件下,结合这三种方法所产生的含水印图像的峰值信噪比,分析了这三种方法的优缺点。

2 数字图像水印算法
数字水印技术是一种基于内容的、非密码机制的计算机信息隐藏技术。它可以将一些标识信息直接嵌入数字载体当中,且不影响原载体的使用价值,也不容易被探知和再次修改,从而实现保护版权、信息隐藏的功能。数字水印按照特性可以分为鲁棒数字水印和脆弱数字水印。本部分重点研究脆弱数字水印的应用,同时分别分析三种水印算法的机理和效果。

2.1 数字图像水印算法的基本框架
如图一所示的是水印嵌入与提取流程图,根据密钥和水印产生算法生成水印信号,通过水印嵌入算法,将水印信号和原始图像进行结合, 得到嵌入了水印的作品。然后,在水印信号提取过程中,可以在相同的密钥下,通过水印产生算法恢复出水印信号。需要注意的是,特定的密钥对水印的嵌入和提取至关重要。
在这里插入图片描述
2.2 叠加法
叠加法通过对原始图像灰度值进行处理,将其按照某个权重叠加上水印图像灰度值即可得到加入水印的图像。同理,若想恢复出水印图像,可以直接将加入水印的图像减去原始图像。
在Matlab中对图像灰度值进行处理要先将图像变换成double类型,然后再进行简单叠加操作。代码如下所示:

imNew=uint8(double(imOri)+0.01*double(imWat)) ;%水印图像灰度权重设为0.01

2.3 最低有效位(LSB)图像水印法
最低有效位算法是一种典型的空间域信息隐藏算法。对于一张8位灰度图像,它的灰度数值可以表示为0到255,那么可以将其分割为从低到高的8位比特平面。因为高位比特平面所占的灰度权重较高,由此可以直接将水印信号的高位比特平面替换原始图像的低位比特平面,从而达到水印嵌入的效果。对于水印提取的过程可以根据加入水印图像的低位比特平面直接进行恢复提取。
将lena图像的第六位到第八位比特平面特换掉cameraman图像比特平面的第一位到第三位,同时保留cameraman图像原本的高位比特平面。
由于低位比特平面所占像素权重不高,所以加入水印的图像不仅效果较好,而且可以很好地隐藏信息。通过代码可以实现低位比特平面恢复水印图像,代码如下,结果如图三所示。

newimgW=newimgW+bitPlaneRec(:,:,i)*2^(4+i); %低位比特平面转移到高位比特平面

在这里插入图片描述
2.4 小波变换法
小波变换是空间时间和频率的局部变换,能有效地从信号中提取信息,通过伸缩和平移等运算功能可对函数或信号进行多尺度的细化分析,达到高频处时间细分和低频处频率细分。一般来说,在数字图像处理中使用的是离散小波变换对图像进行处理,图像被变换成低频域(代表图像的概貌)和高频域(代表图像的细节)两部分,并且高频部分可以分为代表图像水平方向分量的HL,代表图像垂直方向分量LH,以及代表图像对角线方向分量的HH三部分区域。低频系数代表它所在的小波块对应的图像块的平均亮度,高频系数代表图像的纹理和边缘部分。如果对低频区域再进一步进行小波变换,则低频域将按照上述原则递归生成更高一级的低频和高频区域。如图四为图像进行三级分解的结构示意图。
在这里插入图片描述
图五:三级小波分解结构图与示例图
图像经过小波变换后生成的小波图像的数据总量与原图像的数据总量相等, 通过将原始图像和水印信号的小波变换低频系数相加,最终可以得到新的小波域系数,再经过一次小波反变换最终可以获得嵌入水印的图像。水印恢复可以表示为水印信号减去原始信号。图五为小波变换法效果图。
核心代码如下所示:

imNew =uint8(ihaart2(LLwatermarked,LHorig,HLorig,HHorig)); %添加水印图像
imagesc(double(imNew)-double(imOri))%恢复水印

在这里插入图片描述
图六:小波变换法效果图

2.5 DCT变换
2.5.1 DCT变换的特点
在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只反映了图像某一部分的信息。当然也可以对整幅图像的特点,但是运算速度比分块DCT要慢。图像经DCT后,得到的DCT图像有三个特点:
(1) 系数值全部集中到0值附近(从直方图统计的意义上),动态范围很小,这说明用较小的量化比特数即可表示DCT系数;
(2) DCT变换后图像能量集中在图像的低频部分,即DCT图像中不为零的系数大部分集中在一起(左上角),因此编码效率很高。
(3).没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息,这一特点是由DCT缺乏时局域性造成的。

2.5.2 宿主图像的DCT变换
对于N×N大小的256灰度级的宿主图像I进行N×N二维离散余弦变换(DCT)。以ZigZag方式对于DCT变换后的图像频率系数重新排列成一维向量Y={y1, y2,…yN×N}. 并取出序列中第L+1到L+M的中频系数部分,得到YL={ YL+1, YL+2,…, YL+M}。

2.5.3 DCT数字水印嵌入算法流程
在这里插入图片描述
2.5.4 DCT数字水印提取算法流程
在这里插入图片描述

3 水印图像质量评价与分析
图像质量评价通常从两个方面进行,分别是主观评价和客观评价,客观评价通常借由一些特定的指标进行,如PSNR(峰值信噪比)和SSIM(结构相似性)。本部分结合图像质量评价参数峰值信噪比(PSNR)分析前一部分介绍的三种图像水印算法的优缺点。

3.1 峰值信噪比(PSNR)
PSNR定义公式为:
在这里插入图片描述
其中MSE为两幅图像像素点之间的均方误差,MAX表示为灰度最大值,对于一幅8位灰度图像,MAX为255。对于一般的水印图像,更高的PSNR值意味着图像有更好的性能。

⛄二、部分源代码

% Demo to watermark an image by hiding another image in a certain bit
% plane. Sometimes called “LSB Watermarking” or something similar.
% User is asked which bit plane they want to hide the image in.

clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing.
fontSize = 12;

% Read in the image what will have another image hidden into it.
baseFileName=‘moon.tif’;
% baseFileName=‘cameraman.tif’;
folder = fullfile(matlabroot, ‘\toolbox\images\imdemos’);
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, ‘file’)
% Didn’t find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, ‘file’)
% Still didn’t find it. Alert user.
errorMessage = sprintf(‘Error: %s does not exist.’, fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
originalImage = imread(fullFileName);

% Get the number of rows and columns in the original image.
[visibleRows visibleColumns numberOfColorChannels] = size(originalImage);
if numberOfColorChannels > 1
% If it’s color, extract the red channel.
originalImage = originalImage(:,:,1);
end

% Display the original gray scale image.
subplot(3, 3, 4);
imshow(originalImage, []);
title('ԭʼ Ҷ ͼ ', ‘FontSize’, fontSize);
% Enlarge figure to full screen.
set(gcf, ‘units’,‘normalized’,‘outerposition’,[0 0 1 1]);
set(gcf,‘name’,‘Demo by ImageAnalyst’,‘numbertitle’,‘off’)

% read the message image you want to hide in the cover image
baseFileName=‘cameraman.tif’;
% baseFileName=‘moon.tif’;
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, ‘file’)
% Didn’t find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, ‘file’)
% Still didn’t find it. Alert user.
errorMessage = sprintf(‘Error: %s does not exist.’, fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
hiddenImage = imread(fullFileName);
% Get the number of rows and columns in the hidden image.
[hiddenRows hiddenColumns numberOfColorChannels] = size(hiddenImage);
if numberOfColorChannels > 1
% If it’s color, extract the red channel.
hiddenImage = hiddenImage(:,:,1);
end
% Display the image.
subplot(3, 3, 1);
imshow(hiddenImage, []);
title('ͼ ', ‘FontSize’, fontSize);

% Let’s compute and display the histogram.
[pixelCount grayLevels] = imhist(hiddenImage);
subplot(3, 3, 2);
bar(pixelCount);
title(’ ͼ ֱ ͼ’, ‘FontSize’, fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
grid on;

thresholdValue = 70;
binaryImage = hiddenImage < thresholdValue;
% Display the image.
subplot(3, 3, 3);
imshow(binaryImage, []);
caption = sprintf(‘Hidden Image Thresholded at %d’, thresholdValue);
title(caption, ‘FontSize’, fontSize);

% Get the bit plane to hide the image in.
prompt = 'Enter the bit plane you want to hide the image in (1 - 8) ';
dialogTitle = ‘Enter Bit Plane to Replace’;
numberOfLines = 1;
defaultResponse = {‘6’};
bitToSet = str2double(cell2mat(inputdlg(prompt, dialogTitle, numberOfLines, defaultResponse)));

% If image to be hidden is bigger than the original image, scale it down.
if hiddenRows > visibleRows || hiddenColumns > visibleColumns
amountToShrink = min([visibleRows / hiddenRows, visibleColumns / hiddenColumns]);
binaryImage = imresize(binaryImage, amountToShrink);
% Need to update the number of rows and columns.
[hiddenRows hiddenColumns] = size(binaryImage);
end

% Tile the hiddenImage, if it’s smaller, so that it will cover the original image.
if hiddenRows < visibleRows || hiddenColumns < visibleColumns
watermark = zeros(size(originalImage), ‘uint8’);
for column = 1:visibleColumns
for row = 1:visibleRows
watermark(row, column) = binaryImage(mod(row,hiddenRows)+1, mod(column,hiddenColumns)+1);
end
end
% Crop it to the same size as the original image.
watermark = watermark(1:visibleRows, 1:visibleColumns);
else
% Watermark is the same size as the original image.
watermark = binaryImage;
end
% Display the thresholded binary image - the watermark alone.
subplot(3, 3, 5);
imshow(watermark, []);
caption = sprintf(‘Hidden Image\nto be Inserted into Bit Plane %d’, bitToSet);
title(caption, ‘FontSize’, fontSize);

% Set the bit of originalImage(a copy, actually) to the value of the watermark.
watermarkedImage = originalImage; % Initialize
for column = 1 : visibleColumns
for row = 1 : visibleRows
watermarkedImage(row, column) = bitset(originalImage(row, column), bitToSet, watermark(row, column));
end
end

% Display the image.
subplot(3, 3, 6);
imshow(watermarkedImage, []);
caption = sprintf(‘Final Watermarked Image\nwithout added Noise’);
title(caption, ‘FontSize’, fontSize);

% add noise to watermarked image
noisyWatermarkedImage = imnoise(watermarkedImage,‘gaussian’, 0, 0.0005);

% Display the image.
subplot(3, 3, 7);
imshow(noisyWatermarkedImage, []);
caption = sprintf(‘Watermarked Image\nwith added Noise’);
title(caption, ‘FontSize’, fontSize);

%====================================================================================
% Now let’s pretend we are starting with the watermarked noisy corrupted image.
% We want to recover the watermark.

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]宋俊辉,鲁骏.彩色图像数字水印嵌入和提取模型研究——基于DWT和DCT[J].现代商贸工业. 2011,23(17)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值