【图像隐写】基于matlab RS码数字水印嵌入与提取【含Matlab源码 2692期】

⛄一、RS码简介

 RS编码是一种多进制编码技术,适合于存在突发错误的通信系统。RS解码技术相对比较成熟,但由RS码和卷积码构成的级联码在性能上与传统的卷积码相比较提高不多,故在未来第三代移动通信系统采用的可能性不大...
   RS是“Reed-Solomon”(里德-所罗门)的缩写。RS码是一种线性分组循环码,它以长度为n的一组符号(symbols)为单位处理(通常n=8bit,称为编码字),组中的n个符号是由K个欲传输的信息符号按一定关联关系生成的。由于n个符号中还应包含误码保护信息,所以要求k<n编码形式用(n,k)表示,因此,当n=8时,共有28=256种符号,用十进制表示的符号范围是0-255。这256种符号组成一个有限域(称伽罗华域)GF(28)。一般地,当有限域是二元域GF(2)的扩域时用GF(2m)表示。在GF(2m)域中,能纠正T个错误的(n,k)RS码。所谓1个符号的错误可以是指符号中的1bit发生错误,也可以指符号中的若干bit甚至所有mbit都发生错误。可见,RS码具有极强的随机错误和突发错误纠正能力。正因为RS码性能优良,同时由于近年来VLSI技术发展,使原来非常复杂、难以实现的解码电路集成化,目前,功能很强的、长RS码的编码器芯片也商业化了。因此RS码得到广泛应用。

·1960 年 MIT Lincoln Lab 的 Reed 和 Solomon 在发表了论文“Polynomial Codes over Certain Finite Fields”
· RS 码是一种效率很高的分组码,RS 码是一类非二进制 BCH 码, 每个符号由 m 比特组成。
·对于给定n,k的分组码,没有其他码能比RS码的最小距离更大。
·既适用于纠随机误码,也特别适用于纠突发误码。
·任何一种缩短的 RS 码仍是一个最大码。
·RS 码的精确纠错性能是由码的最小距离和权分布决定的, 非常便于根据指标设计RS 码
举例:RS(255,239)
n=255, m=8
k=239, t=8

⛄二、部分源代码

clc;clear;
%文件名的处理
disp(‘1 lena’);
disp(‘2 Baboon’);
choiceimage=input(‘选择载体图像(1或2) :’);
if choiceimage==1,
orignal=‘lena.jpg’;
else
orignal=‘Baboon.jpg’;
end
mark=‘水印图像.bmp’;
goalfile=‘imagewatermark.jpg’;
k1=0.02; %k1是强纹理特性的小波块的嵌入强度
k2=0.007; %k2是弱纹理特性的小波块的嵌入强度
%-----------------------%
A=imread(orignal); %A为原图,B是水印
A_double=double(A);
B=imread(mark);
B_double=double(B);
%------置乱水印图片----------------------%
B_arnold=ht_arnold(B_double);
%--------对水印图像进行RS码编码-----------%
T=rers(B_arnold); %RS编码前的预处理,二进制转十进制,成为(115,9)的矩阵
B_RS=zeros(115,15);
B_RS8=uint8(B_RS);
for i=1:115
temp=T(i,:);
temp8=uint8(temp);
msg=gf(temp8,4);
code=rsenc(msg,15,9);
code2=code.x;
B_RS8(i,:)=code2;
B_RS=double(B_RS8);
end
[r,l]=size(B_RS);
B_RS=reshape(B_RS,[rl,1]);
BB=dec2bin(B_RS)-48;
BB=reshape(BB,[100,69]);
%--------------开始嵌入水印---------------%
[a,b]=size(BB);
X=A_double; %X是用来保存嵌入水印的图像的
[cA,cH,cV,cD]=dwt2(A_double,‘db1’); %对原图进行小波变换
[m,n]=size(cA);
cAA=cA;
M=cA;
BLOCK=zeros(4,9); %构建BLOCK用来存放小波块
for i=2 :2:2
a,
for j=3:3:3b,
if BB(i/2,j/3)==0,
q=-1;
else
q=1;
end
M(i,j)=(cA(i-1,j-1)+cA(i-1,j)+cA(i-1,j+1)+cA(i,j-1)+cA(i,j+1)+cA(i+1,j-1)+cA(i+1,j)+cA(i+1,j+1))/8; %用均值代替中间的值
BLOCK=[cA(i-1,j-1) cA(i-1,j) cA(i-1,j+1) cA(i,j-1) M(i,j) cA(i,j+1) cA(i+1,j-1) cA(i+1,j) cA(i+1,j+1)
cH(i-1,j-1) cH(i-1,j) cH(i-1,j+1) cH(i,j-1) cH(i,j) cH(i,j+1) cH(i+1,j-1) cH(i+1,j) cH(i+1,j+1)
cV(i-1,j-1) cV(i-1,j) cV(i-1,j+1) cV(i,j-1) cV(i,j) cV(i,j+1) cV(i+1,j-1) cV(i+1,j) cV(i+1,j+1)
cD(i-1,j-1) cD(i-1,j) cD(i-1,j+1) cD(i,j-1) cD(i,j) cD(i,j+1) cD(i+1,j-1) cD(i+1,j) cD(i+1,j+1)]; %小波块
num=0;
for u=1:36
if BLOCK(u)>0,
num=num+1;
end
end
if num>20,
cAA(i,j)=M(i,j)+q
k1M(i,j);
else
cAA(i,j)=M(i,j)+q
k2*M(i,j);
end
end
end
X=idwt2(cAA,cH,cV,cD,‘db1’); %小波逆变换
X8=uint8(X); %嵌入水印后的图像
imwrite(X8,‘imagewatermark.jpg’);
%-------------------水印的提取
W_RS=tiqu(X,BB);
W_RS=reshape(W_RS,[1725,4]);
%------------RS解码-------------------%
Wa=DECRS(W_RS);
%-----------图像Arnold恢复------------%
W=Ahuifu(Wa);
%------------图像显示------------------%
subplot 221
imshow(A);title(‘原始图像’);
subplot 222
imshow(B);title(‘水印’);

subplot 223
imshow(X8);title(‘嵌入水印后的图像’);
subplot 224
imshow(W);title(‘提取出的水印’);
figure(2)
subplot 121
imshow(B);
subplot 122
imshow(B_arnold);

%--------------评价参数------------------%
disp(‘嵌入水印后与原图的psnr’);
psnr=PSNR(A,X8)
disp(‘不受攻击时提取出的水印与水印图像的NC’);
NC=NC(B,W)

%%------------攻击测试-------------------%
dotap = 0;
%--------------------------------------%
disp(’ 水印攻击测试 ');
disp(‘0 退出 1 不受攻击’);
disp('2 椒盐噪声攻击 3 高斯噪声攻击 ');
disp(‘4 右下角剪切1/4 5 左上角剪切1/8’);
disp(‘6 中间横向剪切1/4 7 JPEG压缩攻击’);
disp(‘8 中值滤波攻击 9 旋转攻击’);
while dotap == 0
attack=input(‘please input a number 1-11:’);
if attack == 0
dotap = 1;
disp(‘程序结束’);
else

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]薛德文.基于变换域的可逆图像水印算法研究[D].哈尔滨工业大学

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

猜你喜欢

转载自blog.csdn.net/TIQCmatlab/article/details/131158103