内容发布更新时间 : 2025/2/11 17:05:43星期一 下面是文章的全部内容请认真阅读。
注:本代码来源于《信息隐藏于数字水印实验教程》,但是源程序在Matlab2012版本上面无法正确运行,因此本人进行简单的修改后可以顺利运行,但是提取的数据还是不对。。。
1. 隐藏算法源代码RLEhiding.m文件
clc; clear all
oi=imread('lena.bmp'); if(length(size(oi))==3) oi=rgb2gray(oi); end
[row col]=size(oi); oi=oi(:); oi=ToBin(oi); len=size(oi); i=1; j=1; t=1;
whilei while (i count=count+1; end RLE(j,:)=[t,count];%RLE为游程 j=j+1; i=i+1; t=t+count; end ifi==len(1) RLE(j,:)=[i,1]; end % RLE=RLE'; msgfid=fopen('hidden.txt','r'); [msg,msgcount]=fread(msgfid); fclose(msgfid); msg=uint8(dec2bin(msg)-48); [htxt,ltxt]=size(msg); mmsg=zeros(htxt,8); if(ltxt<8) n=8-ltxt; mm=zeros(htxt,n); fori=1:htxt mmsg(i,:)=[mm(i,:),msg(i,:)]; end end msg=mmsg'; msgcount=msgcount*8; % for l=1:msgcount % if msg(l)==0 % if((mod(RLE(l,2),2)~=0)&&(RLE(l+1,2)~=1)) % oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2); % RLE(l+1,2)=RLE(l+1,2)-1; % end % else % if((mod(RLE(l,2),2)==0)&&(RLE(l+1,2)~=1)) % oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2); % RLE(l+1,2)=RLE(l+1,2)-1; % end % end % end for l=1:msgcount modpoint=0; for x=1:2*l modpoint=modpoint+RLE(x,2); end ifmsg(l)==0 if ((mod(RLE(2*l,2),2)~=0)&&(RLE(2*l+1,2)~=1)) oi(modpoint+1)=mod(oi(modpoint+1)+1,2); end else if ((mod(RLE(2*l,2),2)==0)&&(RLE(2*l+1,2)~=1)) oi(modpoint+1)=mod(oi(modpoint+1)+1,2); end end end m1=Vector2Matrix(oi,row); m1=m1'; imwrite(m1,'marked.bmp'); figure; subplot(1,2,1);imshow('lena.bmp');title('original image'); subplot(1,2,2);imshow('marked.bmp');title('watermarked image'); 2. Vector2Matrix.m子函数 function A=Vector2Matrix(oi,row) %将数组转换成二位数组,row为行数 cl=length(oi)/row; A=zeros(row,cl); fori=1:row for j=1:cl A(i,j)=oi(cl*(i-1)+j); end end 3. ToBin.m子函数 function A=ToBin(oi) %将像素点的值转换为0和1,oi为一维二值图像数组 A=oi; fori=1:length(oi) if(oi(i)<128) A(i)=0; else A(i)=1; end end 4. 提取算法源代码RLEextract.m文件 clc; clear all; oi=imread('marked.bmp'); if(length(size(oi))==3) oi=rgb2gray(oi); end [row col]=size(oi); oi=oi(:); len=size(oi); i=1; j=1; while(i