基于DCT变换(变换域)实现信息隐藏(数字水印)原理详解及matlab实现

基于DCT变换(变换域)实现信息隐藏(数字⽔印)原
理详解及matlab实现
主要就是实现了数字⽔印的嵌⼊提取和在不同攻击如旋转剪切噪声等下的提取效果差异的⽐对
1 DCT变换的原理
2  DCT变换的特点
在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只反映了图像某⼀部分的信息。当然也可以对整幅图像的特点,但是运算速度⽐分块DCT要慢。图像经DCT后,得到的DCT图像有三个特点:
(1). 系数值全部集中到0值附近(从直⽅图统计的意义上),动态范围很⼩,这说明⽤较⼩的量化⽐特数即可表⽰DCT系数;
(2). DCT变换后图像能量集中在图像的低频部分,即DCT图像中不为零的系数⼤部分集中在⼀起(左上⾓),因此编码效率很⾼。
(3). 没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息,这⼀特点是由DCT缺乏时局域性造成的。
3 宿主图像的DCT变换
对于N×N⼤⼩的256灰度级的宿主图像I进⾏N×N⼆维离散余弦变换(DCT)。以ZigZag⽅式对于DCT变换后的图像频率系数重新排列成⼀维向量Y={y1, y2,…y N×N}.  并取出序列中第L+1到L+M的中频系数部分,得到YL={ Y L+1, Y L+2,…, Y L+M}。
4 DCT数字⽔印嵌⼊算法流程
5.DCT数字⽔印提取算法流程
matlab代码实现:
DCT主函数
%------------------------------------------------------------------%
%    基于DCT变换的信息隐藏(数字⽔印)    %%                                                                %%                                                                % %-----------------------------------------------------------=------%
clear ;
clc;
%-----------------------读⼊图像-------------------------------------%
markbefore=imread('sss.bmp');
markbefore2=rgb2gray(markbefore);
mark=im2bw(markbefore2);    %使⽔印图像变为⼆值图
figure(1);      %打开窗⼝
subplot(2,3,1);    %该窗⼝内的图像可以有两⾏三列
imshow(mark),title('⽔印图像');  %显⽰⽔印图像
[rm,cm]=size(mark);  %计算⽔印图像的长宽
cover_image=imread('carrier_image.bmp');
cover_image=rgb2gray(cover_image);
subplot(2,3,2),imshow(cover_image,[]),title('载体图像'); %[]表⽰显⽰时灰度范围为image上的灰度最⼩值到最⼤值
before=blkproc(cover_image,[8 8],'dct2');  %将载体图像的灰度层分为8×8的⼩块,每⼀块内做⼆维DCT变换,结果记⼊矩阵before
I=mark;
alpha=30;    %尺度因⼦,控制⽔印添加的强度,决定了频域系数被修改的幅度
k1=randn(1,8);  %产⽣两个不同的随机序列
k2=randn(1,8);
after=before;  %初始化载⼊⽔印的结果矩阵
for i=1:rm          %在中频段嵌⼊⽔印
for j=1:cm
x=(i-1)*8;
y=(j-1)*8;
if mark(i,j)==1
k=k1;
else
k=k2;
end;
after(x+1,y+8)=before(x+1,y+8)+alpha*k(1);
after(x+2,y+7)=before(x+2,y+7)+alpha*k(2);
after(x+3,y+6)=before(x+3,y+6)+alpha*k(3);
after(x+4,y+5)=before(x+4,y+5)+alpha*k(4);
after(x+5,y+4)=before(x+5,y+4)+alpha*k(5);
after(x+6,y+3)=before(x+6,y+3)+alpha*k(6);
after(x+7,y+2)=before(x+7,y+2)+alpha*k(7);
after(x+8,y+1)=before(x+8,y+1)+alpha*k(8);
end;
end;
result=blkproc(after,[8 8],'idct2');    %将经处理的图像分为8×8的⼩块,每⼀块内做⼆维DCT逆变换
result = uint8(result);
imwrite(result,'markresule.bmp','bmp');      %存储添加⽔印后的图像
subplot(2,3,3),imshow(result,[]),title('嵌⼊⽔印的图像');    %显⽰添加⽔印后的图像
%定义⼀个空空间来存储提取的⽔印
disp('请选择对图像的攻击⽅式:');
disp('1.添加⽩噪声');
disp('2.⾼斯低通滤波处理');
disp('3.对图像进⾏部分剪切');
disp('4.将图像旋转⼗度');
disp('5.将图像压缩处理');
disp('6.添加椒盐噪声');
disp('7.不处理图像,直接显⽰提取⽔印');
disp('输⼊其它数字则直接显⽰提取⽔印');
choice=input('请输⼊选择:');
choice=input('请输⼊选择:');
figure(1);
switch choice        %读⼊输⼊的选择  withmark为等待提取⽔印的图像
case 1
result_1=result;
withmark=imnoise(result_1,'gaussian',0.02); %加⼊椒盐躁声
subplot(2,3,4);
imshow(withmark,[]);
title('加⼊⾼斯⽩噪声后的图像');    %显⽰加了椒盐噪声的图像
case 2
result_2=result;
H=fspecial('gaussian',[4,4],0.2);
result_2=imfilter(result_2,H);
subplot(2,3,4);
imshow(result_2,[]);
title('⾼斯低通滤波后图像');
withmark=result_2;
case 3
result_3=result;
result_3(1:64,1:400)=512;  %使图像上⽅被剪裁
subplot(2,3,4);
imshow(result_3);
title('上⽅剪切后图像');胞苷酸
withmark=result_3;
case 4
result_4=imrotate(result,10,'bilinear','crop');  %最邻近线性插值算法旋转10度        subplot(2,3,4);
imshow(result_4);
title('旋转10度后图像');
withmark=result_4;
case 5
贴片铝电解电容result_5 = result;
result_5=im2double(result_5);
cnum=10;
环氧树脂涂层
dctm=dctmtx(8);
P1=dctm;
P2=dctm.';
imageDCT=blkproc(result_5,[8,8],'P1*x*P2',dctm,dctm.');
DCTvar=im2col(imageDCT,[8,8],'distinct').';
n=size(DCTvar,1);
DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
[dum,order]=sort(DCTvar);
cnum=64-cnum;
mask=ones(8,8);
mask(order(1:cnum))=zeros(1,cnum);
im88=zeros(9,9);
im88(1:8,1:8)=mask;
im128128=kron(im88(1:8,1:8),ones(16));
dctm=dctmtx(8);
P1=dctm.';
P2=mask(1:8,1:8);
P3=dctm;
result_5=blkproc(imageDCT,[8,8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm);        WImage5cl=mat2gray(result_5);
subplot(2,3,4);
imshow(WImage5cl);
title('经JPEG压缩后图像');
withmark=WImage5cl;热镀锌合金
case 6
result_6=result;
引线器
withmark=imnoise(result_6,'salt & pepper',0.02); %加⼊椒盐躁声
subplot(2,3,4);
imshow(withmark,[]);
title('加⼊椒盐噪声后的图像');    %显⽰加了椒盐噪声的图像
case 7
subplot(2,3,4);
subplot(2,3,4);
imshow(result,[]);
title('未受攻击的⽔印图像');
withmark=result;
otherwise
disp('输⼊数字选择⽆效,图像未受攻击,直接提取⽔印');
subplot(2,3,4);
imshow(result,[]);
title('未受攻击的⽔印图像');
withmark=result;
end
%------------------------⽔印提取-----------------------------%
%
after_2=blkproc(withmark,[8,8],'dct2');  %此步开始提取⽔印,将灰度层分块进⾏DCT变换
p=zeros(1,8);        %初始化提取数值⽤的矩阵
mark_2 = zeros(rm,cm);
for i=1:rm
for j=1:cm
x=(i-1)*8;y=(j-1)*8;
p(1)=after_2(x+1,y+8);        %将之前改变过数值的点的数值提取出来
p(2)=after_2(x+2,y+7);
p(3)=after_2(x+3,y+6);
p(4)=after_2(x+4,y+5);
p(5)=after_2(x+5,y+4);
p(6)=after_2(x+6,y+3);
p(7)=after_2(x+7,y+2);
p(8)=after_2(x+8,y+1);
if corr2(p,k1)>corr2(p,k2)  %corr2计算两个矩阵的相似度,越接近1相似度越⼤
mark_2(i,j)=1;              %⽐较提取出来的数值与随机频率k1和k2的相似度,还原⽔印图样        else道路检测
mark_2(i,j)=0;
end
end
end
subplot(2,3,5);
mark_2 = uint8(mark_2);
imshow(mark_2,[]),title('提取出的⽔印');
subplot(2,3,6);
imshow(mark),title('原嵌⼊⽔印');
NC=correlation(mark_2,mark);
disp('原⽔印图像与提取⽔印图像互相关系数:')
disp(NC);
correlation函数:
function N=correlation(mark_get,mark_prime)
mark_get=double(mark_get);
mark_prime=double(mark_prime);
if size(mark_get)~=size(mark_prime)
error('Input vectors must  be the same size!')
else
[m,n]=size(mark_get);
fenzi=0;
fenmu=0;
for i=1:m
for j=1:n
fenzi=fenzi+mark_get(i,j)*mark_prime(i,j);
fenmu=fenmu+mark_prime(i,j)*mark_prime(i,j);
end
end
N=min(fenzi/fenmu,fenmu/fenzi);
end
其中的⼀个效果图

本文发布于:2024-09-22 13:41:43,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/212310.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   提取   变换   数值   噪声
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议