今天给各位分享二值图像信息隐藏的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
2)基于二值图像掌握信息隐藏
2、原理
1) 二值图像也称为单色图像或黑白图像。一般用1或0来表示黑色或白色像素。利用二值图像信息隐藏的方法主要是根据二值图像中黑白像素数量的比较来隐藏信息。
2)方法是将二值图像划分为一系列矩形图像区域B,如果某个图像区域B中黑色像素的数量大于一半,则表示嵌入0;如果白色像素数大于一半,则表示嵌入1。但是当要嵌入的位数与所选区域的黑白像素的比例不一致时,为了达到想要的像素关系,颜色一些像素需要修改。
3)该方法存在一定的缺陷。它没有明确定义哪些像素可以被修改以隐藏秘密信息。对二值图像中某些像素的修改可能会导致二值图像的视觉效果发生较大变化。相应的水印嵌入算法可能会严重损害图像质量。
4)为了达到更好的隐藏效果,可以采用游程编码方法来隐藏二值图像中的信息。嵌入秘密信息时修改二进制图像的游程长度。如果秘密信息位为0,则修改游程长度为偶数;如果为1,则修改游程长度为奇数;如果秘密信息的值与游程长度匹配,则游程长度不会改变。在提取过程中,根据游程奇偶校验来提取秘密信息。隐藏信息时,改变一次run的奇偶校验是通过修改下一次run的第一个像素的像素值,因此当下一次run的值为1时不能修改。
3.普通方式
1.1 嵌入秘密信息。打开MATLAB 7.1,点击“文件”-“新建”-“M-文件”,打开M文件编辑窗口,输入命令。如图所示
1.2 完整命令如下:
clc;
全部清除;
msgfid=fopen('hidden.txt','r'); %打开秘密文件
[msg,count]=fread(msgfid);
fclose(msgfid);
味精=str2bit(味精);
味精=味精';
计数=计数*8;
io=imread('二之.bmp'); %读取载体图像
watermarklen=count %嵌入水印信息长度,即载体图像块的数量
[行列]=大小(io);
l1=floor(行/watermarklen); %载体图像分块后的长度
l2=floor(col/watermarklen); %载体图像分块后的宽度
像素数=l1*l2; %每个块的总像素数
百分比=ceil(像素数/2);
iw=io;
ioblack(1,watermarklen)=0; %某块中黑色像素点的个数
iowhite(1,watermarklen)=0; %某一块中白色像素点的个数
n=1;
而n=watermarklen
对于i=l1*(n-1)+1:l1*n
对于j=l2*(n-1)+1:l2*n
如果io(i,j)==0
ioblack(1,n)=ioblack(1,n)+1; %计算每个块中黑色像素的数量
别的
iowhite(1,n)=iowhite(1,n)+1; %计算每个块中白色像素的数量
结尾
结尾
结尾
n=n+1;
结尾
n=1;
而n=watermarklen
if msg(n,1)==1 % 需要嵌入1
如果ioblack(1,n)=百分比; %embedding 1时,黑色像素多于白色像素,需要修改部分像素的颜色。
modcount(1,n)=ioblack(1,n)-百分比+1;
k=1;
对于i=l1*(n-1)+1:l1*n
对于j=l2*(n-1)+1:l2*n
if (iw(i,j)==0k=modcount(1,n))
iw(i,j)=1;k=k+1;
结尾
结尾
结尾
结尾
别的
如果iowhite(1,n)=百分比; %嵌入0时,白色像素多于黑色像素,需要修改部分像素的颜色。
modcount(1,n)=iowhite(1,n)-百分比+1;
k=1;
对于i=l1*(n-1)+1:l1*n
对于j=l2*(n-1)+1:l2*n
if (iw(i,j)==1k=modcount(1,n))
iw(i,j)=0;k=k+1;
结尾
结尾
结尾
结尾
结尾
n=n+1;
结尾
n=1;
iwblack(1,watermarklen)=0; %某块中黑色像素点的个数
iwwhite(1,watermarklen)=0; %某一块中白色像素点的个数
而n=watermarklen
对于i=l1*(n-1)+1:l1*n
对于j=l2*(n-1)+1:l2*n
如果iw(i,j)==0
iwblack(1,n)=iwblack(1,n)+1; %计算每个块中黑色像素的数量
别的
iwwhite(1,n)=iwwhite(1,n)+1; %计算每个块中白色像素的数量
结尾
结尾
结尾
n=n+1;
结尾
数字;
imshow('二之.bmp');
imwrite(iw,'erzhimarked.bmp');
数字;
imshow('erzhimarked.bmp');
1.3 单击工具栏中的“保存”命令,将M文件保存到工作文件夹(C:\Program Files (x86)\MATLAB71\work)中。文件名为binhiding.m。
1.5 返回MATLAB命令窗口,输入命令“binhiding”查看结果。如图所示
1.6 提取秘密信息。创建一个新的M文件“binextract.m”并输入命令。如图所示
1.7 具体命令如下:
clc;
全部清除;
wi=imread('erzhimarked.bmp'); %读取载体图像
[行列]=大小(wi);
水印长度=48; %嵌入水印信息的长度
l1=floor(行/watermarklen); %载体图像分块后的长度
l2=floor(col/watermarklen); %载体图像分块后的宽度
像素黑(1,watermarklen)=0; %某块中黑色像素点的个数
PixelWhite(1,watermarklen)=0; %某一块中白色像素点的个数
n=1;
而n=watermarklen
对于i=l1*(n-1)+1:l1*n
对于j=l2*(n-1)+1:l2*n
如果wi(i,j)==0
像素黑(1,n)=像素黑(1,n)+1; %计算每个块中黑色像素的数量
别的
像素白(1,n)=像素白(1,n)+1; %计算每个块中白色像素的数量
结尾
结尾
结尾
n=n+1;
结尾
n=1;
而n=watermarklen
if Pixelwhite(1,n)pixelblack(1,n) %如果白色像素块多于黑色像素块,则秘密信息为1
消息(n,1)=1;
别的
消息(n,1)=0; %如果黑色像素块多于白色像素块,则秘密消息为0
结尾
n=n+1;
结尾
%将提取的秘密信息转换为字符串
输出=bit2str(消息);
fid=fopen('message.txt', 'wt');
fwrite(fid, 输出);
fclose(fid);
1.8 保存M文件,返回MATLAB命令窗口,输入命令“binextract”运行M文件。打开消息文件。如图所示
4. 运行编码
2.1 新建一个M文件“RLEhiding.m”,在编辑窗口中输入命令。如图所示
2.2 完整命令如下:
clc;
全部清除;
oi=imread('二之.bmp'); %打开载体镜像
[行列]=大小(oi);
oi=oi(:);
长度=大小(oi);
我=1;
我=1;
j=1;
%统计游程长度
当我
或=oi(i,1);
计数=1;
同时(我
我=我+1;
计数=计数+1;
结尾
RLE(j)=计数;
j=j+1;
我=我+1;
结尾
如果i==len(1)
RLE(j)=1;
结尾
RLE=RLE';
msgfid=fopen('hidden.txt','r');%打开秘密文件
[msg,msgcount]=fread(msgfid);
fclose(msgfid);
味精=str2bit(味精);
味精=味精';
消息计数=消息计数*8;
对于l=1:msgcount
模点=0;
对于x=1:2*l
模点=模点+RLE(x,1);
结尾
如果味精(l,1)==0
if ((mod(RLE(2*l,1),2)~=0)(RLE(2*1+1,1)~=1))
oi(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2);
结尾
别的
if ((mod(RLE(2*l,1),2)==0)(RLE(2*1+1,1)~=1))
oi(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2);
结尾
结尾
结尾
%统计修改游程长度
长度=大小(oi);
我=1;
j=1;
当我
或=oi(i,1);
计数=1;
同时(我
我=我+1;
计数=计数+1;
结尾
RLE1(j)=计数;
j=j+1;
我=我+1;
结尾
如果i==len(1)
RLE1(j)=1;
结尾
RLE1=RLE1';
m1=Vector2Matrix(oi,row);%将数组转换为两位数矩阵
imwrite(m1,'水印.bmp');
数字;
imshow('二之.bmp');
数字;
imshow('水印.bmp');
2.4 保存M文件,返回MATLAB命令窗口,运行M文件查看结果。如图所示
2.5 提取隐藏内容。新建M文件RLEextract.m,进入编辑窗口,输入命令。如图所示
2.6 完整命令如下:
clc;
全部清除;
oi=imread('水印.bmp'); %打开秘密图像
[行列]=大小(oi);
oi=oi(:);
长度=大小(oi);
我=1;
我=1;
j=1;
当我
或=oi(i,1);
计数=1;
同时(我
我=我+1;
计数=计数+1;
结尾
RLE(j)=计数;
j=j+1;
我=我+1;
结尾
如果i==len(1)
RLE(j)=1;
结尾
RLE=RLE';
消息计数=80;
对于i=1:msgcount
味精(i,1)=0;
结尾
对于l=1:msgcount
if mod(RLE((2*l),1),2)==0
味精(l,1)=0; %如果run的值为偶数,则表示隐藏信息为0
别的
味精(l,1)=1; %如果run的值为奇数,则表示隐藏信息为1
结尾
结尾
输出=bit2str(消息);
fid=fopen('message1.txt', 'wt');
fwrite(fid, 输出);
fclose(fid);
用户评论
这篇文章写得真好!对二值图像信息隐藏的原理讲解得非常透彻,我以前一直对这个概念不太了解,现在终于明白了它是怎么运作的了!
有6位网友表示赞同!
作者提到的LSB替换法很有意思啊。看起来很简单的方法,竟然能隐藏那么多的信息,感觉未来应用场景很多!
有13位网友表示赞同!
我一直觉得二值图像比较限制性的,没想到还能隐藏那么多信息,真的太厉害了!不过,这个隐藏的信息量和安全性会不会受图片本身大小、复杂度影响呢?
有10位网友表示赞同!
信息隐藏技术真是日新月异啊!以前只知道是把数据嵌入到音频或视频中,现在居然可以用二值图像来隐藏信息,太酷了! 希望以后能看到更多应用场景。
有11位网友表示赞同!
这篇文章读起来有点枯燥,很多原理描述感觉很抽象。对于像我这种对计算机技术不了解的人来说,还是很难完全理解的...
有16位网友表示赞同!
说的没错啊,二值图像信息隐藏确实有很大的应用前景,比如可视传达、密码学以及身份验证等领域都有可能用到。
有9位网友表示赞同!
但有些地方的描述有点过于细节化,我觉得可以适当简化一些,让非专业人士也能更容易理解。
有6位网友表示赞同!
我个人觉得信息隐藏的安全问题才是最重要的,文章里提到了多种攻击方式,让人很担忧!
有9位网友表示赞同!
比如如果攻击者能获取到部分隐藏信息的特征,会不会就能够推断出隐藏的内容呢?
有5位网友表示赞同!
我觉得这篇文章还是很有价值的,因为它介绍了二值图像信息隐藏的新思路,引发了我对未来的思考。
有19位网友表示赞同!
希望以后能看到更多关于二值图像信息隐藏的研究成果,包括更高效、更安全的算法。
有13位网友表示赞同!
对于我这种经常处理图像数据的程序员来说,这篇文章很有帮助!
有11位网友表示赞同!
以后可以在项目中尝试一下二值图像信息隐藏技术,看看能不能提高数据的安全性和隐蔽性。
有9位网友表示赞同!
这个领域的确很热门,有很多潜在的应用场景,但同时也存在一些挑战,比如如何提高隐藏信息的容量和安全性。
有19位网友表示赞同!
我觉得二值图像信息隐藏是一个很有趣的研究方向, 期待看到未来的发展趋势。
有15位网友表示赞同!
我理解二值图像信息隐藏是利用图片本身的纹理特征来隐藏信息,但对于复杂的数据图像,这种方法是不是更容易被识别呢?
有16位网友表示赞同!
我认为二值图像信息隐藏技术的应用前景非常广阔,可用于医疗影像、军事情报等高度安全领域,值得进一步探索!
有6位网友表示赞同!