二值图像信息隐藏-游程编码 下载本文

内容发布更新时间 : 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

while(i

count=count+1; end

RLE(j)=count; j=j+1; i=i+1;