LSB算法数字水印的嵌入与提取以及峰值信噪比PSNR值的计算(Matlab语言)
%文件名:lsbhide.m
%函数功能:本函数将完成顺序嵌入水印的LSB算法,载体选用灰度图像,水印选用二值图像(行数列数相同)
%格式:[ste_cover,len_total]=lsbhide(input,watermark)
%参数说明:
%input:载体图像
%watermark:水印
%ste_cover:嵌入水印的图像矩阵
%len_total:水印长度即水印容量
function [ste_cover,len_total] = lsbhide(cover,wm)
%读入图像矩阵
cover=imread('hill.bmp');
ste_cover=cover;
ste_cover=double(ste_cover);
%读入水印图像
wm=imread('wm.bmp');
%判断水印图像是否符合要求
[ m,n]=size(wm);
if m~=n
error('水印图像不符合要求');
end
%将水印矩阵转化为一维序列
for f1=1:m
for f2=1:n
msg((f1-1)*n+f2)=wm(f1,f2);
end
end
%判断嵌入消息量是否过大
len_total=m*n;
[m,n]=size(ste_cover);
if len_total>m*n
error('嵌入水印过大,请更换图像');
end
p=1; %p作为水印嵌入位数计数器
%在图像像素的LSB嵌入水印
for f1=1:m
for f2=1:n
ste_cover(f1,f2)=ste_cover(f1,f2)-mod(ste_cover(f1,f2),2)+msg(p);
if p == len_total
break;
end
p=p+1;
end
if p == len_total
break;
end
end
%得到含水印图像矩阵
ste_cover=uint8(ste_cover);
%文件名:lsbget.m
%函数功能:本函数将完成提取隐秘于LSB的水印。
%格式:result=lsbget(test,len_total)
%参数说明:
%test:待测图像
%len_total:水印长度
%result:提取水印矩阵
function result = lsbget(test,len_total)
%读入图像矩阵
ste_cover=imread(test);
ste_cover=double(ste_cover);
[m,n]=size(ste_cover);
%p作为水印嵌入位数计数器
p=1;
for f1=1:m
for f2=1:n
if bitand(ste_cover(f1,f2),1)==1
wm(p)=1;
else
wm(p)=0;
end
if p==len_total
break;
end
p=p+1;
end
if p==len_total
break;
end
end
%将提取出的一维水印序列转化为二维矩阵
for f1=1:sqrt(len_total)
for f2=1:sqrt(len_total)
result(f1,f2)=wm((f1-1)*sqrt(len_total)+f2);
end
end
function test()
cover=imread('hill.bmp');
wm=imread('wm.bmp');
[ste_cover,len_total]=lsbhide('cover', 'wm');
imwrite(ste_cover,'hill_wm.bmp');
result=lsbget('hill_wm.bmp',len_total);
figure;
subplot(1,2,1),imshow(cover);title('原始图像');
subplot(1,2,2),imshow(ste_cover);title('含水印图像');
figure;
subplot(1,2,1),imshow(wm);title('原始水印');
subplot(1,2,2),imshow(result);title('提取水印');
%文件名:PSNR.m
%函数功能:计算峰值信噪比
%格式:s=PSNR(original,test)
%参数说明:
%original为原始图像文件
%test为待测图像文件
function s=PSNR(original,test)
%读取图像矩阵
io=imread('hill.bmp');
io=double(io);
iw=imread('hill_wm.bmp');
iw=double(iw);
if(size(io)~=size(iw))
error('错误:两个输入图像大小不一致');
end
%计算PSNR
[m,n]=size(io);
sum=0;
zuida=m*n*max(max(io.^2));
for i=1:m
for j=1:n
sum=sum+(io(i,j)-iw(i,j))^2;
end
end
if(sum==0)
sum=1;
end
s=zuida/sum;
s=10*log10(s);
相关推荐
在matlab2011a中编写的程序,根据atpeace童鞋发布资源中doc文档理解修改后得到,包含水印图片和载体图片。有兴趣的可以看看。
设计实现了一种基于空域的图像水印算法,提出了一种基于空域LSB 算法的数字图像加密算法,对不同的值对应的图像点像素进行不同的加密,然后根据给定的随机整数寻找加密结果的存放位置.实验分析表明,该算法实现起来...
数字图像水印,使用最低有效位算法,matlab实现,简单实现信息隐藏。
LSB算法的基本原理:对空域的LSB做替换,用来替换LSB的序列就是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。由于水印信息嵌入的位置是LSB,为了满足水印的不可见性,允许嵌入的水印强度不可能...
该资源收集了常见的空域数字图像水印算法和一些相关检测算法。
空域数字水印的非常经典有用的算法,不信你下来看看就知道了
本选题需要学习经典的图像信息隐藏算法,包括基于空域的隐写算法和数字水印算法。 接着你将使用某种编程语言实现这些算法,实现在图片中嵌入一些信息,例如字符串和一些 文件。除此之外,还需要尝试一些基础的隐写...
LSB算法的基本原理是:对空域的LSB做替换,用来替换LSB的序列就是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。
研究了经典的空域数字水印算法LSB 在心电图信号认证中的应用,选择在非QRS 复合波内嵌入水印信息,提出了基于 LSB 的自适应数字盲水印算法。通过嵌入水印后的图像效果和攻击实验证明,这种水印嵌入算法对心电图信号...
信息媒体的数字化为信息的保存和提取提供了极大的...在分析加密技术的基础上,阐述了数字图像的水印技术,研究了空域数字图像水印技术,变换域数字图像水印技术,自适应数字图像水印技术,提出了最低有效位算法改进算法。
资源包含文件:设计报告...然而针对空域的各种处理,如游程编码前的预处理,会对不显著分量进行一定的压缩,所以LSB算法对这些操作很敏感。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125518537
现有图像数字水印算法基本上可分为两类:空间域方法和变换域方法。空域法通过直接改变图像某些像素的灰度值来嵌入水印,如LSB、扩展频谱等;而变换域方法先把图像做某种变换,例如DCT、DWT,然后通过改变某些变换...
编译环境为vs2010,使用空域隐藏技术对数字水印进行加密,使用彩色水印,将水印图像素值前四位加到底层图像置零的后四位,得到经过加密的图像。 是LSB水印加密算法的一种改进,使用了彩色水印。