LSB隐写算法的扩展延伸――大容量的信息隐藏算法

匿名 (未验证) 提交于 2019-12-03 00:22:01

%主程序 clear all; close all; clc; %第一部分,信息嵌入 %准备 img=imread('pic.jpg'); imhide=imread('gray.jpg'); figure;imshow(img); title('原图片(RGB图片)'); figure;imshow(imhide);title('待嵌入图片(灰度图片)');  [m,n,h]=size(img); [mhide,nhide]=size(imhide); imgR=img(:,:,1); imgG=img(:,:,2); imgB=img(:,:,3); imgRline=imgR(:); imgGline=imgG(:); imgBline=imgB(:); imhideline=imhide(:); yr=4; yg=5; yb=3; y=zeros(1,8);  imhidelinebin=zeros(mhide*nhide*8,1); for ii=1:mhide*nhide     [imhidelinebin(ii*8),imhidelinebin(ii*8-1),imhidelinebin(ii*8-2),imhidelinebin(ii*8-3),...      imhidelinebin(ii*8-4),imhidelinebin(ii*8-5),imhidelinebin(ii*8-6),imhidelinebin(ii*8-7)]...      =dec2bin_z(imhideline(ii)); end  %开始嵌入 %R flag=0; embedSum=0; imgRlineNew=imgRline; for ii=1:m*n     if(flag==1)         break;     end  [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(imgRline(ii)); fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)); embedNum=fn-yr;    if embedNum>0      for jj=1:embedNum          embedSum=embedSum+1;          if embedSum>mhide*nhide*8              flag=1;              break;           end         y(jj)=imhidelinebin(embedSum);      end      imgRlineNew(ii)=bin2dec_z(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    end end   %开始嵌入 %G imgGlineNew=imgGline; for ii=1:m*n     if(flag==1)         break;     end  [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(imgGline(ii)); fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)); embedNum=fn-yg;    if embedNum>0      for jj=1:embedNum          embedSum=embedSum+1;          if embedSum>mhide*nhide*8              flag=1;              break;           end         y(jj)=imhidelinebin(embedSum);      end      imgGlineNew(ii)=bin2dec_z(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    end end    %B imgBlineNew=imgBline; for ii=1:m*n     if(flag==1)         break;     end  [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(imgBline(ii)); fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)); embedNum=fn-yb;    if embedNum>0      for jj=1:embedNum          embedSum=embedSum+1;          if embedSum>mhide*nhide*8              flag=1;              break;           end         y(jj)=imhidelinebin(embedSum);      end      imgBlineNew(ii)=bin2dec_z(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    end end  %嵌入完成,开始整合 imgNew=zeros(m,n,h); imgR2=reshape(imgRlineNew,[m,n]); imgG2=reshape(imgGlineNew,[m,n]); imgB2=reshape(imgBlineNew,[m,n]); imgNew(:,:,1)=imgR2; imgNew(:,:,2)=imgG2; imgNew(:,:,3)=imgB2; figure;imshow(uint8(imgNew));title('嵌入后的RGB图片'); imwrite(uint8(imgNew),'imgNew.jpg','quality',100);%即使保存了,即使保存的质量是100但是保存后的图片数据跟matlab里计算得的图片数据不一样了,                                                   %所以无法从保存后的imgNew.jpg里提取到任何水印 % r=imread('imgNew.jpg');  % r=double(r); % imgNew=double(imgNew); % dif=r-imgNew; % dif1=dif(:,:,1);                     %dif1不为0矩阵,所以matlab的imwrite存在失真  %第二部分,信息提取 %只有知道图片原来的形状,才能提取出完整的水印。  Imhidelinebin=zeros(8*mhide*nhide,1); %准备工作 ImgRline=imgR2(:); ImgGline=imgG2(:); ImgBline=imgB2(:);   flag=0;       extractSum=0; embedNum=0; y=zeros(8,1);  %R for ii=1:m*n     if flag==1         break;     end    [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(ImgRline(ii));    fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    embedNum=fn-yr;    if embedNum>0               for jj=1:embedNum;                       extractSum=extractSum+1;            if extractSum>8*mhide*nhide            flag=1;            break;           end           Imhidelinebin(extractSum)=y(jj);        end    end end  %G for ii=1:m*n     if flag==1         break;     end    [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(ImgGline(ii));    fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    embedNum=fn-yg;    if embedNum>0              for jj=1:embedNum;           extractSum=extractSum+1;            if extractSum>8*mhide*Hide            flag=1;            break;           end           Imhidelinebin(extractSum)=y(jj);        end    end end  %B for ii=1:m*n     if flag==1         break;     end    [y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=dec2bin_z(ImgBline(ii));    fn=firstNzreo(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));    embedNum=fn-yb;    if embedNum>0               for jj=1:embedNum;           extractSum=extractSum+1;            if extractSum>8*mhide*Hide            flag=1;            break;           end           Imhidelinebin(extractSum)=y(jj);        end    end end  %在工作区看到embedSum跟extractSum相等,说明提取没有出错 %提取完毕,开始整合 Imhideline=zeros(mhide*nhide,1); for ii=1:mhide*nhide    Imhideline(ii)=bin2dec_z(Imhidelinebin(ii*8),Imhidelinebin(ii*8-1),Imhidelinebin(ii*8-2),Imhidelinebin(ii*8-3),...         Imhidelinebin(ii*8-4),Imhidelinebin(ii*8-5),Imhidelinebin(ii*8-6),Imhidelinebin(ii*8-7)); end Imhide=reshape(Imhideline,[mhide,nhide]); figure;imshow(uint8(Imhide));title('提取出的灰度图片'); dif=double(Imhide)-double(imhide);%dif为零矩阵,说明没有误差
%function firstNzreo %第一个不是零的位置 function po=firstNzreo(y8,y7,y6,y5,y4,y3,y2,y1) if            y8~=0  po=8; elseif       y7~=0  po=7;  elseif       y6~=0  po=6; elseif       y5~=0  po=5; elseif       y4~=0  po=4; elseif       y3~=0  po=3; elseif       y2~=0  po=2; else         po=1; end

%function bin2dec_z    %二进制转十进制 function dec=bin2dec_z(y8,y7,y6,y5,y4,y3,y2,y1)  dec=y1+2*y2+4*y3+8*y4+16*y5+32*y6+64*y7+128*y8; end

%function bin2dec_z %十进制转二进制 function [y8,y7,y6,y5,y4,y3,y2,y1]=dec2bin_z(dec) y1=mod(dec,2); dec=(dec-y1)/2; y2=mod(dec,2); dec=(dec-y2)/2; y3=mod(dec,2); dec=(dec-y3)/2; y4=mod(dec,2); dec=(dec-y4)/2; y5=mod(dec,2); dec=(dec-y5)/2; y6=mod(dec,2); dec=(dec-y6)/2; y7=mod(dec,2); dec=(dec-y7)/2; y8=mod(dec,2);  end




参考 :
谢建全, 阳春华. 大容量的信息隐藏算法[J]. 计算机工程, 2008, 34(8):167-169

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!