分享一下最近看到的一個(gè)關(guān)于圖片嵌入隱藏的算法:
“大容量的信息隱藏算法",這是一種基于空間域的自適應(yīng)多平面位的信息隱藏算法期吓。該算法計(jì)算復(fù)雜度低、信息隱藏量大。且有實(shí)驗(yàn)表明在不影響圖像視覺(jué)效果的前提下讨勤,其信息隱藏量比LSB算法大箭跳,并具有更高的安全性。該算法的主要思想是對(duì)每個(gè)像素點(diǎn)進(jìn)行判斷潭千,根據(jù)HVS的特性谱姓,在最高非0有效位后的指定位(y)開(kāi)始嵌入隱藏信息,嵌入到另一個(gè)指定位(z)為止刨晴。
下面直接貼上MATLAB代碼和實(shí)驗(yàn)結(jié)果:
(1)?main_ImgEmbed.m
clc;
clearall;
closeall;
warningoffall;
yr=4;//論文中實(shí)驗(yàn)得到
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(:);%二維數(shù)組轉(zhuǎn)成一列
Imgmarklinebin=zeros(markm*markn*8,1);%轉(zhuǎn)化為二進(jìn)制
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
%%
%嵌入
%對(duì)于紅色通道
embedNumsed=0;%已嵌入個(gè)數(shù)
[M,N,Z]=size(Img);
y=zeros(8,1);
flag=0;%輔助跳出的標(biāo)志
ImgRline=ImgR(:);%轉(zhuǎn)換為一列
ImgRlineNew=ImgRline;%嵌入后
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%能嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
embedNumsed=embedNumsed+1;%已嵌入個(gè)數(shù)
ifembedNumsed>markm*markn*8%嵌入完成
flag=1;%設(shè)置標(biāo)識(shí)屉来,使外層循環(huán)也跳出
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]);
%對(duì)于G通道
ImgGline=ImgG(:);%轉(zhuǎn)換為一列
ImgGlineNew=ImgGline;%嵌入后
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%能嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
embedNumsed=embedNumsed+1;%已嵌入個(gè)數(shù)
ifembedNumsed>markm*markn*8%嵌入完成
flag=1;%設(shè)置標(biāo)識(shí),使外層循環(huán)也跳出
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]);
%對(duì)于B通道
ImgBline=ImgB(:);%轉(zhuǎn)換為一列
ImgBlineNew=ImgBline;%嵌入后
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%能嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
embedNumsed=embedNumsed+1;%已嵌入個(gè)數(shù)
ifembedNumsed>markm*markn*8%嵌入完成
flag=1;%設(shè)置標(biāo)識(shí)狈癞,使外層循環(huán)也跳出
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),'介質(zhì)圖片_嵌入圖像后.jpg'); %保存圖片
%%
%提取嵌入圖像
flag=0;
Imgmark_extractlinebin=zeros(markm*markn*8,1);
extractNumsed=0;%已提取個(gè)數(shù)
% R通道
ImgRline2=ImgR2(:);%轉(zhuǎn)換為一列
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%已嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
extractNumsed=extractNumsed+1;%已提取個(gè)數(shù)
ifextractNumsed>markm*markn*8%提取完成
flag=1;%設(shè)置標(biāo)識(shí)茄靠,使外層循環(huán)也跳出
break;
end
Imgmark_extractlinebin(extractNumsed)=y(jj);%提取
end
end
end
% G通道
ImgGline2=ImgG2(:);%轉(zhuǎn)換為一列
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%已嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
extractNumsed=extractNumsed+1;%已提取個(gè)數(shù)
ifextractNumsed>markm*markn*8%提取完成
flag=1;%設(shè)置標(biāo)識(shí),使外層循環(huán)也跳出
break;
end
Imgmark_extractlinebin(extractNumsed)=y(jj);%提取
end
end
end
% G通道
ImgBline2=ImgB2(:);%轉(zhuǎn)換為一列
forii=1:M*N
ifflag==1;%跳出外層循環(huán)
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;%已嵌入的個(gè)數(shù)
ifembedNums>0%符合嵌入條件
forjj=1:embedNums
extractNumsed=extractNumsed+1;%已提取個(gè)數(shù)
ifextractNumsed>markm*markn*8%提取完成
flag=1;%設(shè)置標(biāo)識(shí)蝶桶,使外層循環(huán)也跳出
break;
end
Imgmark_extractlinebin(extractNumsed)=y(jj);%提取
end
end
end
%二進(jìn)制轉(zhuǎn)十進(jìn)制
Imgmarklinedec=zeros(markm*markn,1);%轉(zhuǎn)化為十進(jìn)制
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_提取結(jié)果.jpg'); %保存圖片
%檢查提取的水印和原水印的區(qū)別
difmarked=Imgmarkextract-Imgmark;%做差
%發(fā)現(xiàn)差為0慨绳,即說(shuō)明完全一致,提取正確
(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
%二進(jìn)制轉(zhuǎn)十進(jìn)制
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
%找出第一個(gè)不為零的數(shù)位 從最高位(第八位)開(kāi)始
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
實(shí)驗(yàn)結(jié)果如下:
(1)原圖
(2)要嵌入隱藏的圖片
(3)嵌入隱藏圖片后的介質(zhì)圖像
(4)提取的嵌入圖片
整個(gè)工程代碼下載請(qǐng)到:http://download.csdn.net/download/tianma5/9508467
才疏學(xué)淺真竖,多多指教脐雪。