基于LSB的图像数字水印实验

1. 实验类别

设计型实验:MATLAB设计并实现基于LSB的图像数字水印算法。

2. 实验目的

了解信息隐藏中最常用的LSB算法的特点,掌握LSB算法原理,设计并实现一种基于图像的LSB隐藏算法。

 

3. 实验条件

(1) Windows 2000或Windows Xp以上操作系统;

(2) MATLAB 6.5以上版本软件;

(3)图像文件

4. 实验原理

 基于LSB的图像数字水印

任何多媒体信息在数字化时都会产生物理随机噪声,而人的感官系统对这些随机噪声并不敏感。替换技术就是利用这个原理,通过使用秘密信息比特替换随机噪声,从而实现信息隐藏目的。图像高位平面对图像感官质量起主要作用,去除图像最低几个位平面并不会造成画面质量的下降。利用这个原理可用秘密信息(或称水印信息)替代载体图像低位平面以实现信息嵌入。

LSB算法选用最低位平面来嵌入秘密信息,最低位平面对图像的视觉效果影响最轻微,但很容易受噪声影响和攻击,可采用冗余嵌入的方式来增强稳健性加以解决,即在一个区域中嵌入相同的信息,提取时根据该区域中的所有像素判断。

 

1.嵌入水印.m脚本代码:

clear all;
clc;
picpath = input('请输入图片绝对路径(加单引号):');
watermark_path = input('请输入水印文件绝对路径(加单引号):');
msgfid = fopen(watermark_path,'r');     % 打开秘密文件,读入秘密信息
[key,count] = fread(msgfid,'ubit1');    % 读取秘密信息,存入key,count为成功读入了多少位
fclose(msgfid);                         % 关闭文件
i = imread(picpath);
i1 = i(:,:,1);                          % 提取RGB第1层嵌入水印
[row,col] = size(i1);                   % x行y列
contents = row * col;                   % 图像能嵌入水印最大比特数
if count > contents
    disp('warning: 当前图片容量无法通过LSB方法嵌入所有水印信息!按enter退出matlab.');
    pause;
    quit;
else
    disp(['当前图片通过LSB能嵌入的最大水印比特数为: ',num2str(contents),' bits']);
end
key_counter = 1;
round_counter = 0;
total_watermark_bits = 0;
if mod(count,row) == 0
    round = floor(count/row);
else
    round = floor(count/row) + 1;
end
 
for ii=1:1:round
       for jj = 1:1:row
           i1(jj,ii) = bitset(i1(jj,ii),1,key(key_counter,1));% bitset函数改变像素值最后一位bit为水印bit值
           key_counter = key_counter + 1;
           total_watermark_bits = total_watermark_bits + 1;
           if key_counter > count
               break;
           end
       end  %内层for
       round_counter = round_counter + 1;
       disp(['当前嵌入轮数: ',num2str(round_counter)]);
       if key_counter > count
           disp(['LSB嵌入正常结束!共嵌入水印比特数: ',num2str(total_watermark_bits),' bits']);
           break;
       end
end  %外层for
i(:,:,1) = i1; 
imwrite(i,'E:\new\LSB_watermarked.bmp');
figure;
subplot(1,2,1);
imshow(picpath);
title('原始图像');
subplot(1,2,2);
imshow(i);
title('LSB嵌入水印后的图像');

 

运行截图:

2.提取水印.m脚本代码:

clear all;
clc;
picpath = input('请输入待提取LSB水印图片绝对路径(加单引号):');
watermark_bits = input('请输入提取的水印比特数:');
i = imread(picpath);                                   % 读取含有水印信息的彩色图像
i1 = i(:,:,1);
key = zeros(watermark_bits,1);                         % 创建一个watermark_bits行1列的全0矩阵,用于存放水印比特
[row,col] = size(i1);   
key_counter = 1;
round = 0;
round_counter = 0;
total_watermark_bits = 0;
if mod(watermark_bits,row) == 0
    round = floor(watermark_bits/row);
else
    round = floor(watermark_bits/row) + 1;
end
for ii = 1:1:round
    for jj = 1:1:row
        key(key_counter,1) = bitget(i1(jj,ii),1);  % 提取图像矩阵的bit水印信息
        key_counter = key_counter + 1;
        total_watermark_bits = total_watermark_bits + 1;
        if key_counter > watermark_bits
            break;
        end 
    end %内层for
    round_counter = round_counter + 1;
    disp(['当前提取轮数: ',num2str(round_counter)]);
    if key_counter > watermark_bits
        disp(['LSB水印提取正常结束!共提取水印比特数:',num2str(total_watermark_bits),' bits']);
        break;
    end
end %外层for

fobject = fopen('E:\new\LSB_watermark.txt','w');       % 以只写模式打开一个名为mark_message.txt的文件,不存在则创建之
fwrite(fobject,key,'bit1');               % 将key矩阵中的数作为bit写入文件句柄为fobject的文件
fclose(fobject);                          % 关闭文件句柄所对应的文件

运行后hidden.txt与LSB_watermark.txt文件水印内容

 

LSB水印实验的要点

1.该实验选取的是彩色RGB图像,是3维图像,因此要选RGB中的某一层进行水印嵌入,可以选第123层,分别对于R,G,B,本实验选择R层及第一层i1 = i(:,:,1)

2.还应对图像所能容纳水印比特最大数进行检查,以防水印信息太多导致嵌入失败.

 

3.嵌入完成后,要将选取的RGB层赋给原3维矩阵对应层i(:,:,1) = i1

 

4.代码注意ifforend配对,一个iffor配一个end

上述脚本在matlab6.5能正确运行.

若有不足欢迎指正;若有疑问鄙人也乐于为道友解答,欢迎留言或加QQ群!

 

欢迎加入QQ群:735472015,群内有VC,MFC,win32API,批处理,python学习资料干货喔?

 

若您觉得对您有帮助,不妨点个赞?呗!

 

 

转载于:https://www.cnblogs.com/lyj-blogs/p/10569314.html

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值