图片嵌入-大容量的信息隐藏算法

分享一下最近看到的一个关于图片嵌入隐藏的算法:

“大容量的信息隐藏算法",这是一种基于空间域的自适应多平面位的信息隐藏算法。该算法计算复杂度低、信息隐藏量大。且有实验表明在不影响图像视觉效果的前提下,其信息隐藏量比LSB算法大,并具有更高的安全性。该算法的主要思想是对每个像素点进行判断,根据HVS的特性,在最高非0有效位后的指定位(y)开始嵌入隐藏信息,嵌入到另一个指定位(z)为止。

下面直接贴上MATLAB代码和实验结果:

(1) main_ImgEmbed.m

clc;

clearall;

closeall;

warningoffall;

yr=4;//论文中实验得到

yg=5;

yb=3;

Img=imread('lena.jpg');

figure;imshow(Img,[]);title('原图');

Img=double(Img);

ImgR=Img(:,:,1);

ImgG=Img(:,:,2);

ImgB=Img(:,:,3);

Imgmark=imread('ImgEmbed.jpg');

Imgmark=double(Imgmark);

figure;imshow(Imgmark,[]);title('ImgEmbed');

[markm,markn]=size(Imgmark);

Imgmarkline = Imgmark(:);%二维数组转成一列

Imgmarklinebin=zeros(markm*markn*8,1);%转化为二进制

forii=1:markm*markn

[Imgmarklinebin(8*ii-7),Imgmarklinebin(8*ii-6),Imgmarklinebin(8*ii-5),Imgmarklinebin(8*ii-4),Imgmarklinebin(8*ii-3),...

Imgmarklinebin(8*ii-2),Imgmarklinebin(8*ii-1),Imgmarklinebin(8*ii)]=Find8bits(Imgmarkline(ii));

end

%%

%嵌入

%对于红色通道

embedNumsed=0;%已嵌入个数

[M,N,Z]=size(Img);

y=zeros(8,1);

flag=0;%辅助跳出的标志

ImgRline=ImgR(:);%转换为一列

ImgRlineNew=ImgRline;%嵌入后

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgRline(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yr;%能嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

embedNumsed=embedNumsed+1;%已嵌入个数

ifembedNumsed>markm*markn*8%嵌入完成

flag=1;%设置标识,使外层循环也跳出

break;

end

y(jj)=Imgmarklinebin(embedNumsed);%嵌入

end

end

ImgRlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的

end

ImgR2=reshape(ImgRlineNew,[M,N]);

%对于G通道

ImgGline=ImgG(:);%转换为一列

ImgGlineNew=ImgGline;%嵌入后

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgGline(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yg;%能嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

embedNumsed=embedNumsed+1;%已嵌入个数

ifembedNumsed>markm*markn*8%嵌入完成

flag=1;%设置标识,使外层循环也跳出

break;

end

y(jj)=Imgmarklinebin(embedNumsed);%嵌入

end

end

ImgGlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的

end

ImgG2=reshape(ImgGlineNew,[M,N]);

%对于B通道

ImgBline=ImgB(:);%转换为一列

ImgBlineNew=ImgBline;%嵌入后

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgBline(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yb;%能嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

embedNumsed=embedNumsed+1;%已嵌入个数

ifembedNumsed>markm*markn*8%嵌入完成

flag=1;%设置标识,使外层循环也跳出

break;

end

y(jj)=Imgmarklinebin(embedNumsed);%嵌入

end

end

ImgBlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的

end

ImgB2=reshape(ImgBlineNew,[M,N]);

ImgNew=zeros(M,N,Z);

ImgNew(:,:,1)=ImgR2;

ImgNew(:,:,2)=ImgG2;

ImgNew(:,:,3)=ImgB2;

figure;imshow(uint8(ImgNew),[]);title('嵌入后的RGB图');

% imwrite(uint8(ImgNew),'介质图片_嵌入图像后.jpg'); %保存图片

%%

%提取嵌入图像

flag=0;

Imgmark_extractlinebin=zeros(markm*markn*8,1);

extractNumsed=0;%已提取个数

% R通道

ImgRline2=ImgR2(:);%转换为一列

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgRline2(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yr;%已嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

extractNumsed=extractNumsed+1;%已提取个数

ifextractNumsed>markm*markn*8%提取完成

flag=1;%设置标识,使外层循环也跳出

break;

end

Imgmark_extractlinebin(extractNumsed)=y(jj);%提取

end

end

end

% G通道

ImgGline2=ImgG2(:);%转换为一列

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgGline2(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yg;%已嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

extractNumsed=extractNumsed+1;%已提取个数

ifextractNumsed>markm*markn*8%提取完成

flag=1;%设置标识,使外层循环也跳出

break;

end

Imgmark_extractlinebin(extractNumsed)=y(jj);%提取

end

end

end

% G通道

ImgBline2=ImgB2(:);%转换为一列

forii=1:M*N

ifflag==1;%跳出外层循环

break;

end

[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgBline2(ii));

posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));

embedNums=posNzreo-yb;%已嵌入的个数

ifembedNums>0%符合嵌入条件

forjj=1:embedNums

extractNumsed=extractNumsed+1;%已提取个数

ifextractNumsed>markm*markn*8%提取完成

flag=1;%设置标识,使外层循环也跳出

break;

end

Imgmark_extractlinebin(extractNumsed)=y(jj);%提取

end

end

end

%二进制转十进制

Imgmarklinedec=zeros(markm*markn,1);%转化为十进制

forii=1:markm*markn

Imgmarklinedec(ii)=bin2dec_trans(Imgmark_extractlinebin(8*ii-7),Imgmark_extractlinebin(8*ii-6),Imgmark_extractlinebin(8*ii-5),Imgmark_extractlinebin(8*ii-4),...

Imgmark_extractlinebin(8*ii-3),Imgmark_extractlinebin(8*ii-2),Imgmark_extractlinebin(8*ii-1),Imgmark_extractlinebin(8*ii));

end

Imgmarkextract=reshape(Imgmarklinedec,[markm,markn]);

figure;imshow(Imgmarkextract,[]);title('提取的嵌入图片');

% imwrite(uint8(Imgmarkextract),'待嵌入图片_gray_提取结果.jpg'); %保存图片

%检查提取的水印和原水印的区别

difmarked=Imgmarkextract-Imgmark;%做差

%发现差为0,即说明完全一致,提取正确

(2)Find8bits.m

function[y7,y6,y5,y4,y3,y2,y1,y0]=Find8bits(Data)

y0=mod(Data,2);

y7=fix(Data/128);Data=Data-y7*128;

y6=fix(Data/64); Data=Data-y6*64;

y5=fix(Data/32); Data=Data-y5*32;

y4=fix(Data/16); Data=Data-y4*16;

y3=fix(Data/8);  Data=Data-y3*8;

y2=fix(Data/4);  Data=Data-y2*4;

y1=fix(Data/2);  Data=Data-y1*2;

end

(3)bin2dec_trans.m

%二进制转十进制

functionData=bin2dec_trans(y7,y6,y5,y4,y3,y2,y1,y0)

Data=y7*128+y6*64+y5*32+y4*16+y3*8+y2*4+y1*2+y0;

end

(4)FindNotZero.m

%找出第一个不为零的数位 从最高位(第八位)开始

functionposNzreo=FindNotZero(y7,y6,y5,y4,y3,y2,y1,y0)

ify7~=0      posNzreo=8;

elseify6~=0  posNzreo=7;

elseify5~=0  posNzreo=6;

elseify4~=0  posNzreo=5;

elseify3~=0  posNzreo=4;

elseify2~=0  posNzreo=3;

elseify1~=0  posNzreo=2;

elseposNzreo=1;

end

end

实验结果如下:

(1)原图

(2)要嵌入隐藏的图片

(3)嵌入隐藏图片后的介质图像

(4)提取的嵌入图片

整个工程代码下载请到:http://download.csdn.net/download/tianma5/9508467

才疏学浅,多多指教。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容