1 算法介绍
1.1 小波变换
一维离散小波变换
从滤波器的观点来看,对于一维小波变换就是把信号分别通过低通滤波器和高通滤波器把原始信号分解为原信号的近似系数和原信号的细节系数两个部分,其物理思想就是去除信号在空间尺度的关联关系,而用数值来表达原始信号。
通过离散小波变换提取我们感兴趣的特征。离散小波变换可以将原信号分解为信号本身特征(低频部分)和其细节特征(高频部分)两种,而且可以对于分解后得到的信号本身特征(低频部分)也可以通过小波变换再得到该信号的本身特征和该信号的细节特征,这就为我们提供了多分辨率,我们可以根据自己的应用来决定对信号进行几层变换。小波变换的实现算法是 mallat 算法。
二维离散小波变换
与一维小波变换相似,对于二维小波变换需要通过滤波器来消除信号中的关联,但是二维信号有着横向和纵向两个方向上的联系,故我们在使用滤波器时需要在横向和纵向每个方向上使用两次滤波器,才能消除信号在那两个方向上的联系。通常实现二维DWT采用分离计算方法。分离计算方法基于二维张量积多分辨分析中的二维尺度函数与小波函数的可分离的特点,用一维小波滤波器分别对二维信号(图象)在水平和竖直进行卷积,最后得到所要的结果。
1988年,S.Mallat利用多分辨率分析的概念,提出了离散小波变换的快速分解与重构算法,即Mallat算法,解决了小波变换计算比较复杂的问题.在实际应用中,对于N×N的图像,需要应用二维离散小波变换。二维离散小波变换的快速算法如下:
式中g和h为分解低通和高通小波滤波器; 表示能量集中的低频子带,体现灰度变化;
为水平低频垂直高频子带,具有水平边缘信息;
为水平高频垂直低频子带,具有垂直边缘信息;
为水平高频垂直高频子带,具有对角边缘信息;原始输入信号为
,j为变换级数,
。
图中表示下2采样,即输出只剩下输入样本数的一半。首先,原始图像N×N经过水平滤波器组分解成低频和高频分量;然后,数据再通过垂直滤波器组,最终分解成为4个子带图像数据(N/2)×(N/2),完成一级变换.变换后的3个高频分量LH,HL和HH直接输出,而低频分量LL,送到下一级滤波器组中进行第二级变换,依次类推,最终完成小波变换。
变换举例:若使用haar小波基,按下面图4.2,
-
先列采样,得到两幅图,一幅保留偶数列,一幅保留奇数列,行不变;
-
然后两幅图像做差分,结果保留在其中一幅A,则A为高频(H),另一幅B只参与运算,不改变结果,作为低频(L);
-
对图A,做行采样,得奇偶,差分得高频图像(HH)和低频图像(HL)。
-
对图B,做行采样,差分得高频图像(LH)和低频图像(LL),完成一遍变换;
-
对低频(LL)作为一幅新的图像,重复上面的变换。
PS:
- 其中LL得到的过程中只是只参与的运算,未改变过自身,即LL只是原图的一个采样图,如下图3左上角所示。
- 通过采样进行多尺度多分辨率处理,提取的是特征点。如一个三角形,它的角是弯的,直接检测不会被认为是角点,但采样过后,这个弯的角点可能就变成尖的,就会被采集到。(多尺度的作用参考SIFT算法)
- 用奇偶行(或列)进行差分得到高频特征,是由Haar小波基的定义而来(一上一下,采样后相当于小波基宽度加大,而其他小波基则对应卷积得到高频,不处理为低频?)。对于其他的小波基则不一定一样。
- 与傅立叶变换不同,小波变换能提取高频分量及其对应的位置信息。
1.2 RANSAC
RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。
RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
5.最后,通过估计局内点与模型的错误率来评估模型。
这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。
2 部分代码
% Example 3, Affine registration
clear,close all;
num=0;
count=6;
Ber_count=zeros(count,1);Psnr_count=zeros(count,1);Nc_count=zeros(count,1);
thet_rv1=zeros(count,1);thet_rv2=zeros(count,1);
Sx_rv1=zeros(count,1);Sy_rv1=zeros(count,1);S_un_rv1=zeros(count,1);
Sx_rv2=zeros(count,1);Sy_rv2=zeros(count,1);S_un_rv2=zeros(count,1);
T_m=cell(count,1);Scl_fc=zeros(count,1);
while num<count
num=num+1;
pause(0);
close all;
clearvars -except num count Ber_count Psnr_count Nc_count thet_rv1 thet_rv2 ...
Sx_rv1 Sy_rv1 Sx_rv2 Sy_rv2 S_un_rv1 S_un_rv2 T_m;
%% 读取水印,两层水印:1、空域做标志位的水印;2、DCT域具有版权保护的水印
% flg_grp=round(rand(5,16)); %% 空域做标志位的水印
wm_lca=[1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1];
flg_grp=[wm_lca;wm_lca;wm_lca;wm_lca;wm_lca];
I_wm=imread('480.bmp');
wm_cpy=~I_wm;
% wm=load('wm_seq');
% wm1=wm.Li;
% wm_cpy=reshape(wm1,24,length(wm1)/24)';
fig=6;
% figure(fig);
% subplot(2,4,1);
% imshow(wm_cpy,[]),title('水印图象');
% wm_cpy(14,:)=[];
% wm_cpy(14,:)=[];
% wm_cpy(14,:)=[];
% wm_cpy(end,:)=[];
% wm_cpy(end,:)=[];
% wm_cpy(end,:)=[];
figure(fig);
subplot(2,4,1);
imshow(wm_cpy,[]),title('水印图象');
% key=10;
% wm_cpy=Arnold(wm_cpy,key);
dimI=size(wm_cpy);
ro=dimI(1);co=dimI(2);
amt=1; %每个包的长度
K1=ro*co/amt; %包数量
b_t=reshape(wm_cpy',amt,K1);
b_t0=b_t';
b=cell(K1,1);
n=1;
for i=1:K1
m=1;
for j=1:amt
b{n,1}(1,m)=b_t0(i,j);
m=m+1;
end
n=n+1;
end
b_uncode=cell(K1,1);
for i=1:K1
for j=1:amt
b_uncode{i,1}(1,j)=num2str(b{i,1}(1,j));
end
end
% wm_cpr=imread('img64.bmp');
% dimI=size(wm_cpr);
% ro=dimI(1);co=dimI(2);
% amt=4; %每个8*8DCT块嵌入的信息bits数
% K=ro*co/amt; %包数量
% wm_cpr1=reshape(wm_cpr',amt,K);
%% 对版权水印信息进行LT码编码
K=length(b_uncode(:,1)); %包数量
L=length(b_uncode{1,1}); %包长度
redundancy=4.62; %编码冗余
M=round(K*(1+redundancy))+6-mod(round(K*(1+redundancy)),6); % 考虑编码冗余,形成M个编码包
% Gen_array1=zeros(M,K);
% mu=robust_soliton(K); % 鲁棒孤波度分布
% mu_max=find(mu>0.1/K,1,'last') ;
% mu=mu(1:mu_max); %去除mu后面数值接近于0的部分
% mu_M=randsample(1:length(mu),M,true,mu); % 给M个编码包分别分配一个度数
% mu_M=uint8(round(mu_M)); % 度数取整
% % msg_coded=cell(M,2); %定义矩阵,存放编码后的信息
% tic;
% for i=1:M
% k=mu_M(i); % 取一个度数
% x=cell(1,2);% x 为每个编码后的包,定义为1*2的元胞
% pos=randperm(K); pos=pos(1:k); % 产生k个范围在1~K之间的随机数,作为参与混合的包的序号
% for n=1:k
% Gen_array1(i,pos(n))=1;
% end
% x{1,1}=pos; % 元胞的第1个元存放参与混合的包的序号
%
% x{1,2}='0' ; % 元胞的第2个元存放混合后的信息
% for j=pos
% temp0=bin2dec(x{1,2});
% temp1=bin2dec(b_uncode{j,1});
% temp2=bitxor(temp0,temp1);
% x{1,2}=dec2bin(temp2,amt);
% end
% msg_coded(i,:)=x;
% end
% t0=toc;
% t0
%
% save('G_nk-Matr.mat','Gen_array1');
Gnk=load('G_nk-Matr.mat');
Gen_array1=Gnk.Gen_array1;
msg_coded=cell(M,2); %定义矩阵,存放编码后的信息
for i=1:M
pos=find(Gen_array1(i,:)==1);
x{1,1}=pos; % 元胞的第1个元存放参与混合的包的序号
x{1,2}='0' ; % 元胞的第2个元存放混合后的信息
for j=pos
temp0=bin2dec(x{1,2});
temp1=bin2dec(b_uncode{j,1});
temp2=bitxor(temp0,temp1);
x{1,2}=dec2bin(temp2,amt);
end
msg_coded(i,:)=x;
end
% save('Msg_coded.mat','msg_coded');
code_pack=load('Msg_coded.mat');
mag_coded=code_pack.msg_coded;
%% 将长度为1的LT码数据包整理成长度为6的CRC码包,准备生成校验码
crc4_ini0=cell(M/6,1);
mm=1;
for i=1:length(crc4_ini0)
l=1;
for j=1:6
crc4_ini0{mm,1}(1,l)=msg_coded{6*(i-1)+j,2};
l=l+1;
end
mm=mm+1;
end
%% 对编码后的包进行CRC6初始化
% crc4_ini0=msg_coded(:,2);
M=M/6;
h=crc.generator('Polynomial',[1 0 0 0 0 1 1],...
'InitialState',[0 0 0 0 0 0], 'ReflectInput', false, 'ReflectRemainder', false,...
'FinalXOR',[0 0 0 0 0 0]);
crc4_ini=cell(M,1);
for i=1:M
temp0=bin2dec(crc4_ini0{i,1});
temp1=de2bi(temp0,6,'left-msb'); %注意:此处只能用de2bi
msg=reshape(temp1',6, 1);
crc4_ini{i,1}=generate(h,msg)';
end
%%检测crc6的算法正确性
crc4_tmp=cell(M,1);
for i=1:M
for j=1:length(crc4_ini{1,1})
crc4_tmp{i,1}(1,j)=num2str(crc4_ini{i,1}(1,j));
end
end
%% 先在DWT-DCT混合变换域嵌入版权水印,两层DWT然后再8*8DCT
I0=imread('lena.bmp');
% I0=imread('baboon0.bmp');
% wm_cpy=round(rand(4,8));
% I0=imresize(I0,[513 513],'bicubic');
[rm,cm]=size(I0);
rect=[17 17 479 479];
I0_crp=imcrop(I0,rect);
%%%对要嵌入的块进行两层DWT,然后再进行8*8DCT变换,嵌入水印
[rm_crp,cm_crp]=size(I0_crp);
% I0_crpwm=zeros(rm_crp,rm_crp);
amt1=8;
% wm_cpy=round(rand(rm_crp/16*cm_crp/16,amt));
% K=rm_crp/16*cm_crp/16;
Y_Matrix=[16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99];
Q50=2.5*Y_Matrix;
im_l=6;
len=M*length(crc4_ini{1,1})/im_l;
rnd1=zeros(len,im_l);
% for i=1:len
% rnd1(i,:)=randperm(8,im_l);
% end
for i=1:len
rnd1(i,:)=[1,2,3,4,5,6];
end
% for i=1:len
% rnd1(i,:)=[2,3,4,5,6,7];
% end
crc_tran=cell(len,1);
m=1;
for i=1:M
n=1;
k=1;
while k<=length(crc4_ini{1,1})/im_l
k=k+1;
for j=1:im_l
crc_tran{m,1}(1,j)=crc4_ini{i,1}(1,n);
n=n+1;
end
m=m+1;
end
end
m=1;
% rr=1;
gamma1=0.20;
zt=1; %小波分解级数
wtype = 'haar'; %小波分解类型
[C,S] = wavedec2(I0_crp,zt,wtype);%多尺度二维小波分解
%%尺度1低频与高频系数提取
ca1 = appcoef2(C,S,wtype,1); %提取尺度1的低频系数
ch1 = detcoef2('h',C,S,1); %提取尺度1的水平方向高频系数
cv1 = detcoef2('v',C,S,1); %提取尺度1的垂直方向高频系数
cd1= detcoef2('d',C,S,1); %提取尺度1的斜线方向高频系数
temp=ca1;
[rm2,cm2]=size(ca1);
cda0=blkproc(temp,[8 8],'dct2');
% c1=uint8([ca1,ch1;cv1,cd1]);
% cda0=b0;
% figure(2);
% cda1=cda0;
%%量化与反量化%%%%
% psnr_cover=double(a0);
% figure(2);
cda1=cda0;
%%水印的嵌入%%%
% savefile = 'rnd1.mat';
% save(savefile, 'rnd1');
% rnd1=load('rnd1.mat');
% rnd1=rnd1.rnd1;
for s=1:rm2/8
if m>len
break;
end
for p=1:cm2/8
if m>len
break;
end
x=(s-1)*8;y=(p-1)*8;l=1;
for n=1:im_l
k=rnd1(m,n);
if k==1
var=abs(cda0(x+1,y+2)/Q50(1,2));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+1,y+2)=(1-gamma1)*sign(cda0(x+1,y+2))*Q50(1,2)*var1+gamma1*cda0(x+1,y+2);
end
if k==2
var=abs(cda0(x+2,y+1)/Q50(2,1));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+2,y+1)=(1-gamma1)*sign(cda0(x+2,y+1))*Q50(2,1)*var1+gamma1*cda0(x+2,y+1);
end
if k==3
var=abs(cda0(x+3,y+1)/Q50(3,1));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+3,y+1)=(1-gamma1)*sign(cda0(x+3,y+1))*Q50(3,1)*var1+gamma1*cda0(x+3,y+1);
end
if k==4
var=abs(cda0(x+2,y+2)/Q50(2,2));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+2,y+2)=(1-gamma1)*sign(cda0(x+2,y+2))*Q50(2,2)*var1+gamma1*cda0(x+2,y+2);
end
if k==5
var=abs(cda0(x+1,y+3)/Q50(1,3));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+1,y+3)=(1-gamma1)*sign(cda0(x+1,y+3))*Q50(1,3)*var1+gamma1*cda0(x+1,y+3);
end
if k==6
var=abs(cda0(x+1,y+4)/Q50(1,4));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+1,y+4)=(1-gamma1)*sign(cda0(x+1,y+4))*Q50(1,4)*var1+gamma1*cda0(x+1,y+4);
end
if k==7
var=abs(cda0(x+2,y+3)/Q50(2,3));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+2,y+3)=(1-gamma1)*sign(cda0(x+2,y+3))*Q50(2,3)*var1+gamma1*cda0(x+2,y+3);
end
if k==8
var=abs(cda0(x+3,y+2)/Q50(3,2));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+3,y+2)=(1-gamma1)*sign(cda0(x+3,y+2))*Q50(3,2)*var1+gamma1*cda0(x+3,y+2);
end
if k==9
var=abs(cda0(x+4,y+1)/Q50(4,1));
if crc_tran{m,1}(1,l)==0
var1=2*floor(var/2+0.5);
elseif crc_tran{m,1}(1,l)==1
var1=2*floor(var/2)+1;
end
cda1(x+4,y+1)=(1-gamma1)*sign(cda0(x+4,y+1))*Q50(4,1)*var1+gamma1*cda0(x+4,y+1);
end
l=l+1;
end
m=m+1;
end
end
% rr=rr+1;
%%% 将8*8DCT块进行IDCT,并将一个64*64的DWT-DCT变换块进行IDWT
ca1_wm=blkproc(cda1,[8 8],'idct2');
len1=S(1,1)*S(1,2); %A(2),H(2),V(2),D(2)的大小
% len2=S(3,1)*S(3,2); %H(1),V(1),D(1)的大小
% len3=S(4,1)*S(4,2)*S(4,3); %H(1),V(1),D(1)的大小
C(1:len1)=ca1_wm(1:end); %%将A(2)放入相应位置
% C(len1+1:2*len1)=ch2(1:end); %%将H(2),V(2),D(2)放入相应位置
% C(2*len1+1:3*len1)=cv2(1:end);
% C(3*len1+1:4*len1)=cd2(1:end);
% C(4*len1+1:4*len1+len2)=ch1(1:end); %%将H(1),V(1),D(1)放入相应位置
% C(4*len1+len2+1:4*len1+2*len2)=cv1(1:end);
% C(4*len1+2*len2+1:4*len1+3*len2)=cd1(1:end);
% I0_crpwm=waverec2(C,S,wtype);
C(len1+1:2*len1)=ch1(1:end); %%将H(2),V(2),D(2)放入相应位置
C(2*len1+1:3*len1)=cv1(1:end);
C(3*len1+1:4*len1)=cd1(1:end);
I0_crpwm=waverec2(C,S,wtype);
% (rr0:rr1,cc0:cc1)=blk64wm;
% end
% end
figure(fig);subplot(242);
imshow(uint8(I0_crpwm),[]),title('嵌入水印后载体图像(仅仅是嵌水印部分)');
I0_wm=double(I0);
I0_wm(17:496,17:496)=I0_crpwm;
figure(fig);subplot(243);
imshow(uint8(I0_wm),[]),title('嵌入水印后载体图像(小波重建后)');
%% 然后利用奇偶量化的方法在空域的特殊位置嵌入一层水印,
I0_wm=uint8(I0_wm); %% 尝试一下到底是直接用double型去奇偶量化效果好些还是用整型好些
coordx_blk=5;coordy_blk=5;
I0_wm=odd_even24(I0_wm,coordx_blk,coordy_blk,flg_grp(1,:));
coordx_blk=5;coordy_blk=78;
I0_wm=odd_even24_lena12(I0_wm,coordx_blk,coordy_blk,flg_grp(2,:));
% coordx_blk=42;coordy_blk=42;
% I0_wm=odd_even24(I0_wm,coordx_blk,coordy_blk,flg_grp(3,:));
coordx_blk=78;coordy_blk=5;
I0_wm=odd_even24_lena21(I0_wm,coordx_blk,coordy_blk,flg_grp(4,:));
coordx_blk=78;coordy_blk=78;
I0_wm=odd_even24(I0_wm,coordx_blk,coordy_blk,flg_grp(5,:));
% imwrite(I0_wm,'img_wm.bmp','bmp');
%% 含水印的图像经过压缩,滤波,剪切等等攻击
I1=im2double(uint8(I0_wm));
% I2_0=I0_wm;
% 先rotation后scale
disp('对嵌入水印的图象攻击,选择项(dt-dcqim法(6in8),加了LT码和CRC6)');
disp('1—添加高斯白噪声');
disp('2-添加椒盐、加性或斑点噪声');
disp('3--高斯低通滤波');
disp('4--均值滤波');
disp('5--中值滤波');
disp('6—直方图统计算法对图像进行增强');
disp('7—直方图规定化对图像进行增强');
disp('8—对图像进行模糊集增强');
disp('9—JPEG 压缩');
disp('10—对图像进行毛玻璃扭曲');
disp('11—尺寸缩放');
disp('12—图象剪切');
disp('13—对图像进行一定角度旋转');
disp('14—对图像进行旋转扭曲');
disp('15—对图像进行平移');
disp('16—对图像先rotation再scale(包括各种RS组合攻击)');
disp('17—对图像先scale再rotation(包括各种RST组合攻击)');
disp('18—对图像先scale再translation');
disp('19—对图像先translation再scale');
disp('20—对图像Rot和Crop的攻击,不去黑色背景');
disp('21—对图像Rot和Crop的攻击,去黑色背景,类似Stirmark中RotCrop攻击');
disp('22—对图像Rot、Sca、Crop的攻击,去黑色背景,类似Stirmark中RotScale攻击');
disp('23—对图像先Rot、再Trans的组合攻击');
disp('24—对图像先Trans、再Rot的组合攻击');
disp('25—对图像先Sca、再Rot、后Trans的组合攻击');
disp('26—对图像先Sca、再Trans、后Rot的组合攻击');
disp('27—对图像Shearing攻击');
disp('28—对图像Linear Geometric Transform/Linear Transform攻击');
disp('29—对图像随机删除几行几列');
disp('0—直接检测水印')
disp('其他—不攻击');
d=input('请选择(0-29)');
I2_2=attack1(d,I0_wm,fig);
%%%去除权威0的行和列,使本文算法可以抵抗RT、RST的组合攻击
% [ro2,co2]=size(I2_2);
% m=0;I2_21=[];
% for i=1:ro2
% if sum(uint8(I2_2(i,:)))>512
% m=m+1;
% I2_21(m,:)=uint8(I2_2(i,:));
% end
% end
% n=0;
% for i=1:co2
% if sum(I2_21(:,i))>512
% n=n+1;
% I2_22(:,n)=I2_21(:,i);
% end
% end
% I2_2=I2_22;
% figure,imshow(uint8(I2_2));title('去除行列为0后的图像')
% I1=im2double(imread('TestImages/lena.bmp'));
% rect=[20 20 460 460];
% I2_2=imcrop(uint8(I2_0),rect);
% 先scale后rotation
% Scl=614;
% I2_1=imresize(I2_0,[Scl Scl],'bilinear'); %%无论是imrotate还是imresize采用'bicubic'是最好的
% I2_2=imrotate(I2_1,10,'bilinear');
I2=im2double(uint8(I2_2)); %先必须化为uint8型,然后用im2double归一化
% Get the Key Points
%% 受攻击后的图像与原图像(备注:此处有误,其实应该为嵌入水印的载体图像)进行第一次特征点的匹配
Options.upright=true;
Options.tresh=0.0002;
Ipts1=OpenSurf(I1,Options);
Ipts2=OpenSurf(I2,Options);
% 挑选Scale在一定范围内的点,因尺度太大或太小,受攻击后易丢失,但受攻击后的图像不需要选择
% m=0;
% for i=1:length(Ipts1)
% if Ipts1(i).scale>=2.0&&Ipts1(i).scale<=6.0
% m=m+1;
% Ipts1_impv(m)=Ipts1(i);
% end
% end
% save('fp_mult.mat','Ipts1_impv');
% fp_tst=load('fp_mult.mat');
% Ipts1_impv=fp_tst.Ipts1_impv;
point_cnt=0;ip_tmp1=[];
for i=1:length(Ipts1)
ip=Ipts1(i);
S = 2 * fix(2.5 * ip.scale);
% R = fix(S / 2);
if S>=10.0&&S<=30
ip_tmp1=[ip_tmp1;Ipts1(i)];
point_cnt=point_cnt+1;
% pt = [(ip.x), (ip.y)];
% ptR = [(R * cos(ip.orientation)), (R * sin(ip.orientation))];
%
% if(ip.laplacian >0), myPen =[0 0 1]; else myPen =[1 0 0]; end
%
% rectangle('Curvature', [1 1],'Position', [pt(1)-R, pt(2)-R, S, S],'EdgeColor',myPen);
%
% plot([pt(1), pt(1)+ptR(1)]+1,[pt(2), pt(2)+ptR(2)]+1,'g');
end
end
% orientation_max=max(ip_tmp1.orientation);
% nc_max=max(Nc_sta(:,1));
% tmp=Nc_sta(:,1)>=0.86*nc_max;
% nc_coord_alt=Nc_sta(tmp,:);
[a1,idx1]=sort(abs([ip_tmp1.doh]),'descend');
ip_sort=ip_tmp1(idx1);
nn=0;ip_fp=ip_sort(1);
for i=2:length(ip_sort)
if nn>=17
break;
end
S_sort = 2 * fix(2.5 * ip_sort(i).scale);
R_sort = fix(S_sort/2);
% mm=0;
kk=0;
for j=1:length(ip_fp)
S_fp = 2 * fix(2.5 * ip_fp(j).scale);
R_fp = fix(S_fp/2);
% mm=mm+1;
if sqrt((ip_fp(j).x-ip_sort(i).x)^2+(ip_fp(j).y-ip_sort(i).y)^2)>=R_sort+R_fp
kk=kk+1;
end
end
if kk==length(ip_fp)
nn=nn+1;
ip_fp=[ip_fp;ip_sort(i)];
end
end
save('fp_invT_480_lna1.mat','ip_fp');
figure,imshow(I1,[]);hold on;
for i=1:length(ip_fp)
ip=ip_fp(i);
S = 2 * fix(2.5 * ip.scale);
R = fix(S / 2);
% if S>=12&&S<=30
% ip_tmp1=[ip_tmp1;ipts(i)];
% point_cnt=point_cnt+1;
pt = [(ip.x), (ip.y)];
ptR = [(R * cos(ip.orientation)), (R * sin(ip.orientation))];
if(ip.laplacian >0), myPen =[0 0 1]; else myPen =[1 0 0]; end
rectangle('Curvature', [1 1],'Position', [pt(1)-R, pt(2)-R, S, S],'EdgeColor',myPen);
plot([pt(1), pt(1)+ptR(1)]+1,[pt(2), pt(2)+ptR(2)]+1,'g');
end
fp1=load('fp_invT_480_lna1.mat');
Ipts1_impv=fp1.ip_fp;
% Ipts2_impv=[];
n=0;
for i=1:length(Ipts2)
if Ipts2(i).scale>=2.0&&Ipts2(i).scale<=6.5
n=n+1;
Ipts2_impv(n)=Ipts2(i);
end
end
% Ipts2_impv=Ipts2;
% Put the landmark descriptors in a matrix
D1 = reshape([Ipts1_impv.descriptor],64,[]);
D2 = reshape([Ipts2_impv.descriptor],64,[]);
% Find the best
% matches,最近邻次近邻比值的阈值设定法挑选,Ransac算法再进行一次挑选,是否要用到最小二乘法拟合那个矩阵???
err=zeros(1,length(Ipts1_impv));
% cor1=1:length(Ipts1_impv);
cor2=zeros(1,length(Ipts1_impv));
ratio=zeros(length(Ipts1_impv),1);
dis_store=zeros(length(Ipts1_impv),2);
dis_ratio=zeros(length(Ipts1_impv),5);
for i=1:length(Ipts1_impv)
distance=sum((D2-repmat(D1(:,i),[1 length(Ipts2_impv)])).^2,1);
dis_sort=sort(distance,'ascend');
dis_store(i,:)=[dis_sort(1),dis_sort(2),];
ratio(i)=dis_sort(1)/dis_sort(2);
[err(i),cor2(i)]=min(distance);
dis_ratio(i,:)=[dis_store(i,:) ratio(i) i cor2(i)];
end
dis_ratio1=sortrows(dis_ratio,3);
mask1=dis_ratio1(:,3)<=0.9;
dis_ratio2=zeros(sum(mask1),5);
nn=0;
for i=1:length(dis_ratio1)
if mask1(i)
nn=nn+1;
dis_ratio2(nn,:)=dis_ratio1(i,:);
end
end
% 利用Ransac算法对匹配的点再进行一次挑选
max_itera=50; %设置最大迭代次数
sigma=1.8; %设置拟合矩阵[m11,m12,m13;m21,m22,m23;0,0,1]还原的偏差
pretotal=0; %符合拟合模型的数据的个数
k=0;
% sample=round(18*rand(50,3));
% save('Index.mat','sample');
sam_tmp=load('Index.mat');
Samp=sam_tmp.sample;
while pretotal <= size(dis_ratio2,1)*0.75 && k<max_itera %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
SampIndex=Samp(k+1,:);
% SampIndex=round(1+(size(dis_ratio2,1)-1)*rand(3,1)); %产生三个随机索引,找样本用,floor向下取整
samp1_tmp=dis_ratio2(SampIndex,4); %对原数据随机抽样两个样本
samp2_tmp=dis_ratio2(SampIndex,5);
samp1=[Ipts1_impv(samp1_tmp).y;Ipts1_impv(samp1_tmp).x]; % 此处特别注意,其实在利用SURF算法时,其中有一步
samp2=[Ipts2_impv(samp2_tmp).y;Ipts2_impv(samp2_tmp).x]; % 通过旋转Haar小波模板求响应值,将X,Y的坐标对调了
att_matr=Matrix_solv(samp1,samp2); %对两组数据拟合出矩阵,或其他变种拟合方法
total=0;dis_ratio3=[];
for j=1:size(dis_ratio2,1)
x_ini=Ipts1_impv(dis_ratio2(j,4)).y;y_ini=Ipts1_impv(dis_ratio2(j,4)).x;
x_atk=Ipts2_impv(dis_ratio2(j,5)).y;y_atk=Ipts2_impv(dis_ratio2(j,5)).x;
tmp=att_matr*[x_atk;y_atk;1];
x_red=tmp(1);y_red=tmp(2);
if sqrt((x_ini-x_red)^2+(y_ini-y_red)^2)<sigma
total=total+1;
dis_ratio3=[dis_ratio3;dis_ratio2(j,:)];
end
end
% mask=abs(line*[data ones(size(data,1),1)]'); %求每个数据到拟合直线的距离
% total=sum(mask<sigma); %计算数据距离直线小于一定阈值的数据的个数
if total>pretotal %找到符合拟合矩阵数据最多的拟合矩阵
pretotal=total;
bestmatr=att_matr; %找到最好的拟合矩阵
best_disratio=dis_ratio3; %找到最符合条件的那些坐标
best_matr_r=att_matr;
end
k=k+1;
end
best_matr_r1=inv(best_matr_r);
% Sort matches on vector distance
% [err, ind]=sort(err);
cor1_1=best_disratio(:,4);
cor2_1=best_disratio(:,5);
%% 法1 用左除命令(m=A\b)来寻求矩阵m的最小二乘解
% coord_ini_matr=[];coord_x_att=[];
% for i=1:length(best_disratio)
% tmp=
% coord_ini_matr=[coord_ini_matr;]
% tmp=ones(length(best_disratio),1);
tmp=ones(size(best_disratio,1),1);
coord_ini_matr=[[Ipts1_impv(cor1_1).y]',[Ipts1_impv(cor1_1).x]',tmp];
coord_x_att=[Ipts2_impv(cor2_1).y]';
att_matr_13=coord_ini_matr\coord_x_att;
coord_y_att=[Ipts2_impv(cor2_1).x]';
att_matr_46=coord_ini_matr\coord_y_att;
att_matr_ls=[att_matr_13';att_matr_46';0,0,1];
% T_m{num,1}=att_matr_ls;
%%% 真实的放射攻击矩阵
%%%% 法2:先用已知X坐标拟合m11,m12,m13,再用已知Y坐标拟合m21,m22,m23,并和法1的结果相比较,验证矩阵左除是否是LS解
% att_matr_13_1=lsqnonneg(coord_ini_matr,coord_x_att);
% att_matr_46_1=lsqnonneg(coord_ini_matr,coord_y_att);
% att_matr_ls1=[att_matr_13_1';att_matr_46_1';0,0,1]; %%这不是最小二乘法吧???和att_matr_ls差别非常大
% Make vectors with the coordinates of the best matches
Pos1=[[Ipts1_impv(cor1_1).y]',[Ipts1_impv(cor1_1).x]'];
Pos2=[[Ipts2_impv(cor2_1).y]',[Ipts2_impv(cor2_1).x]'];
% Pos1=Pos1(1:15,:);
% Pos2=Pos2(1:15,:);
% Show both images
% I = zeros([size(I1,1) size(I1,2)*2 size(I1,3)]);
% I(:,1:size(I1,2),:)=I1; I(:,size(I1,2)+1:size(I1,2)+size(I2,2),:)=I2;
% figure, imshow(I); hold on;
%%gray image
I = zeros([round(1.6*size(I1,1)) round(size(I1,2)*2.6) ]);
I(1:size(I1,1),1:size(I1,2))=I1; I(1:size(I2,1),size(I1,2)+1:size(I1,2)+size(I2,2))=I2;
figure, imshow(I,[]); hold on;
% Show the best matches
plot([Pos1(:,2) Pos2(:,2)+size(I1,2)]',[Pos1(:,1) Pos2(:,1)]','-');
plot([Pos1(:,2) Pos2(:,2)+size(I1,2)]',[Pos1(:,1) Pos2(:,1)]','o');
%% 等比例缩放与旋转、不等比例缩放与旋转、仅有不等比例缩放的判定,若为不等比例缩放与旋转的攻击,则判定先R还是先S
m11=att_matr_ls(1,1);m12=att_matr_ls(1,2);
m21=att_matr_ls(2,1);m22=att_matr_ls(2,2);
% Sca_flag_un=0; %%不等比例缩放标志,对于先R在不等比例S,必须先还原S,然后再还原角度
% Sca_flag=0;
% RS_dist_condi1=abs(abs(m12/m11)-abs(m21/m22)); %% 到底是先不等比S还先R的区别条件
% % RS_dist_condi2=abs(abs(m11/m22)-abs(m21/m12)); %% 备注:此处在多想一下,有没有更精准的判定准则???
% % RS_dist_condi2 判定条件没多大意义,不等比例S、R的组合攻击都是如此
% if abs(m11-m22)>=0.05 %% 存在不等比例缩放或不等比例缩放与旋转的攻击
% if RS_dist_condi1<=0.015 %% 判定为先R再S(不等比)Plane这幅图比较特殊,这个值需大一些
% % [Sx,theta1]=solve('Sx*cosd(theta1)=m11','-Sx*sind(theta1)=m12','Sx','theta1');
% % [Sy,theta2]=solve('Sy*sind(theta2)=m21','Sy*sind(theta2)=m22','Sy','theta2');
% theta1=atand(-m12/m11); theta2=atand(m21/m22);
% Sx_nu=sqrt(m11^2+m12^2);Sy_nu=sqrt(m21^2+m22^2);
% Sx_nu
% Sy_nu
% theta=(theta1+theta2)/2;
% theta
% if abs(theta)<0.25
% disp('仅存在不等比例缩放');
% Sx_nu=m11;Sy_nu=m22;
% Sx_nu
% Sy_nu
% Rot_flag=0;
% Sca_flag=1; %%此处还是用Sca_flag吧,为了和水印判断那段程序统一
% [ro2,co2]=size(I2);
% x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu);
% I4=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic'); %%将不等比例缩放还原
% Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;
%
%
% else
% disp('存在不等比例缩放与旋转的攻击(先R再S)');
% [ro2,co2]=size(I2);
% x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu); %%对于先R再S的不等比例攻击必须先还原S,若先还原角度则会造成类似于Shearing的攻击
% I2=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic'); %%备注:论文中如何描述、阐明???
% Sca_flag=1; %%此处还是先用Sca_flag吧,为了和水印判断那段程序统一
% I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');
% I3=im2double(I3_tmp);
% figure,imshow(I3,[]),title('旋转theta角度后校正的图像');
% Rot_flag=1; %imrotate攻击标志
% I4=im2uint8(I3);
% Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;
% thet_rv1(num,1)=theta;
% end
% else %% 判定为先S再R(不等比)
% % [Sx,theta1]=solve('Sx*cosd(theta1)=m11','Sx*sind(theta1)=m21','Sx','theta1');
% % [Sy,theta2]=solve('-Sy*sind(theta2)=m12','Sy*cosd(theta2)=m22','Sy','theta2');
% theta1=atand(m21/m11); theta2=atand(-m12/m22);
% Sx_nu=sqrt(m11^2+m21^2);Sy_nu=sqrt(m12^2+m22^2);
% Sx_nu
% Sy_nu
% theta=(theta1+theta2)/2;
% theta
% if abs(theta)<0.25
% disp('仅存在不等比例缩放');
% Sx_nu=m11;Sy_nu=m22;
% Sx_nu
% Sy_nu
% Rot_flag=0;
% Sca_flag=1; %%此处还是用Sca_flag吧,为了和水印判断那段程序统一
% [ro2,co2]=size(I2);
% x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu);
% I4=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic'); %%将不等比例缩放还原
% Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;
% else
% disp('存在不等比例缩放与旋转的攻击(先S再R)')
% I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');
% I3=im2double(I3_tmp);
% figure,imshow(I3,[]),title('旋转theta角度后校正的图像'); %%%先还原角度
% Rot_flag=1; %imrotate攻击标志
% [ro3,co3]=size(I3);
% x_s_rev=round(ro3/Sx_nu);y_s_rev=round(co3/Sy_nu);
% I3=imresize(im2uint8(I3),[x_s_rev y_s_rev],'bicubic'); %%%再还原缩放尺度
% I4=I3;
% Sca_flag=1; %%此处还是先用Sca_flag吧,为了和水印判断那段程序统一
% Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;
% thet_rv1(num,1)=theta;
% end
% end
% else %%等比例缩放或旋转或等比例缩放与旋转攻击同时有
%
%
% theta1=atand(-m12/m11); theta2=atand(m21/m22);theta3=atand(m21/m11);theta4=atand(-m12/m22);
% theta=(theta1+theta2+theta3+theta4)/4;
% theta
%
% S_un1=sqrt(m11^2+m12^2);S_un2=sqrt(m21^2+m22^2);S_un3=sqrt(m11^2+m21^2);S_un4=sqrt(m12^2+m22^2);
% S_un=(S_un1+S_un2+S_un3+S_un4)/4;
% S_un
%
% if abs(theta)<=0.25
% % figure,imshow(I2,[]);title('没受到旋转攻击的图片');
% I3=I2;
% Rot_flag=0;
% else
% I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');
% I3=im2double(I3_tmp);
% figure,imshow(I3,[]),title('旋转theta角度后校正的图像');
% Rot_flag=1; %imrotate攻击标志
% thet_rv1(num,1)=theta;
% end
% %%判定有无等比例缩放攻击,若有则进行相应的还原
% if abs(S_un-1.0)<=0.015
% figure,imshow(I3);title('没受到等比例缩放攻击的图片');
% I4=im2uint8(I3);
% % Sca_flag=0;
% else
% [ro3,co3]=size(I3);
% x_s_rev=round(ro3/S_un);y_s_rev=round(co3/S_un);
% I4=imresize(im2uint8(I3),[x_s_rev y_s_rev],'bicubic');
% figure,imshow(uint8(I4),[ ]),title('缩放或旋转缩放攻击校正后的图像');
% Sca_flag=1; %受到缩放攻击的标志
% Sca_flag_un=1;
% S_un_rv1(num,1)=S_un;
% end
%
% end
%% 求出仿射矩阵T,利用求逆来还原图像
att_matr_ls1=[m22,m12,0;m21,m11,0;0,0,1];
T_m{num,1}=att_matr_ls1;
T_inv=inv(att_matr_ls1);
transa1=maketform('affine',T_inv);
I4=imtransform(im2uint8(I2),transa1);%WIa为遭遇RST几何攻击后的图像
figure;imshow(uint8(I4),[]);
[ro4,co4]=size(I4);
% I4=im2uint8(I4);
m=0;I4_1=[];
for i=1:ro4
if sum(uint8(I4(i,:)))>512*40
m=m+1;
I4_1(m,:)=I4(i,:);
end
end
n=0;
for i=1:co4
if sum(I4_1(:,i))>512*40
n=n+1;
I4_2(:,n)=I4_1(:,i);
end
end
I4=I4_2;
%% 首先在空域寻找嵌入特殊信息的位置块,以便定位到边缘被破坏的图片的边界以及再一次精准校正
Nc_total4=[];nc_coord_tal4=[];coord_avg4=[];
coordx=25;coordy=25;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I4,coordx,coordy,flg_grp(1,:));
Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];
coordx=25;coordy=463;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena12(I4,coordx,coordy,flg_grp(2,:));
Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];
% coordx=247;coordy=247;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I5,coordx,coordy,flg_grp(3,:));
% Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
coordx=463;coordy=25;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena21(I4,coordx,coordy,flg_grp(4,:));
Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];
coordx=463;coordy=463;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I4,coordx,coordy,flg_grp(5,:));
Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];
%%利用特殊位置的点相对距离求出像素的偏差,并且再一次精准校正
x1x4_dis=coord_avg4(3,1)-coord_avg4(1,1);
x2x5_dis=coord_avg4(4,1)-coord_avg4(2,1);
x_devi=(438-(x1x4_dis+x2x5_dis)*0.5)/(438/512); %若x_devi为正则需要放大,为负则需要缩小
y1y4_dis=coord_avg4(2,2)-coord_avg4(1,2);
y2y5_dis=coord_avg4(4,2)-coord_avg4(3,2);
y_devi=(438-(y1y4_dis+y2y5_dis)*0.5)/(438/512); %若y_devi为正则需要放大,为负则需要缩小
[ro4,co4]=size(I4);
if abs(x_devi)>=2.0&&abs(y_devi)>=2.0
ro5=round(x_devi)+ro4;co5=round(y_devi)+co4;
I5=imresize(I4,[ro5 co5],'bicubic');
Scl_fc(count,1)=1;
elseif abs(x_devi)>=2.0&&abs(y_devi)<2.0
ro5=round(x_devi)+ro4;co5=co4;
I5=imresize(I4,[ro5 co5],'bicubic');
Scl_fc(count,1)=1;
elseif abs(x_devi)<2.0&&abs(y_devi)>=2.0
ro5=ro4;co5=round(y_devi)+co4;
I5=imresize(I4,[ro5 co5],'bicubic');
Scl_fc(count,1)=1;
elseif abs(x_devi)<2.0&&abs(y_devi)<2.0
I5=I4;
end
% Sx_rv2(num,1)=-x_devi/rm;
% Sy_rv2(num,1)=-y_devi/cm;
% Sx_un1=Sx_rv2(num,1);
% Sy_un1=Sy_rv2(num,1);
% Sx_un1
% Sy_un1
% if Sca_flag_un==1
% S_un_rv2(num,1)=-(x_devi+y_devi)/(2.0*cm);
% S_un1=S_un_rv2(num,1);
% S_un1
% end
% end
%% 定位水印嵌入起点并提取水印
I7=I5;
Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
coordx=25;coordy=25;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I7,coordx,coordy,flg_grp(1,:));
Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
coordx=25;coordy=463;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena12(I7,coordx,coordy,flg_grp(2,:));
Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=247;coordy=247;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
coordx=463;coordy=25;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena21(I7,coordx,coordy,flg_grp(4,:));
Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
coordx=463;coordy=463;
[Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I7,coordx,coordy,flg_grp(5,:));
Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
%%% 求出x,y坐标起始点的误差
x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% I6_rect=[17 17 479 479];
I7_crp=imcrop(I7,I7_rect);
%% 判断缩放攻击中是否有无平移攻击,可直接根据那个矩阵best_matr_r1中(1,3)、(2,3)两个系数与
%%% best_matr_s1中(1,3)、(2,3)变化的大小来判断:若两个系数变化率较大则是RS的组合攻击,
%%% 若变化率较小则为ST的组合攻击,但是此法对于先平移再缩放的攻击适用吗???
%%% 备注,此法还是有问题,还是只能用特征点匹配法再匹配一次,然后平移回去
% Trans_flag=0;Rotcrp_flag=0;
% if (Sca_flag==1&&Rot_flag==0)||(Rot_flag==1)
% [ro4,co4]=size(I4);
% % I4=im2uint8(I4);
% m=0;I4_1=[];
% for i=1:ro4
% if sum(uint8(I4(i,:)))>512*40
% m=m+1;
% I4_1(m,:)=I4(i,:);
% end
% end
% n=0;
% for i=1:co4
% if sum(I4_1(:,i))>512*40
% n=n+1;
% I4_2(:,n)=I4_1(:,i);
% end
% end
% I4=I4_2;
% Ipts4=OpenSurf(im2double(uint8(I4)),Options);
% D4 = reshape([Ipts4.descriptor],64,[]);
%
% % Find the best matches
%
% % matches,最近邻次近邻比值的阈值设定法挑选,Ransac算法再进行一次挑选,是否要用到最小二乘法拟合那个矩阵???
% err_s4=zeros(1,length(Ipts1_impv));
% % cor1=1:length(Ipts1_impv);
% cor_s4=zeros(1,length(Ipts1_impv));
% ratio_s4=zeros(length(Ipts1_impv),1);
% dis_store_s4=zeros(length(Ipts1_impv),2);
% dis_ratio_s4=zeros(length(Ipts1_impv),5);
% for i=1:length(Ipts1_impv)
% distance=sum((D4-repmat(D1(:,i),[1 length(Ipts4)])).^2,1);
% dis_sort_s4=sort(distance,'ascend');
% dis_store_s4(i,:)=[dis_sort_s4(1),dis_sort_s4(2),];
% ratio_s4(i)=dis_sort_s4(1)/dis_sort_s4(2);
% [err_s4(i),cor_s4(i)]=min(distance);
% dis_ratio_s4(i,:)=[dis_store_s4(i,:) ratio_s4(i) i cor_s4(i)];
% end
%
% dis_ratio1_s4=sortrows(dis_ratio_s4,3);
% mask1=dis_ratio1_s4(:,3)<=0.65;
% dis_ratio2_s4=zeros(sum(mask1),5);
% nn=0;
% for i=1:length(dis_ratio1_s4)
% if mask1(i)
% nn=nn+1;
% dis_ratio2_s4(nn,:)=dis_ratio1_s4(i,:);
% end
% end
%
% % 利用Ransac算法对匹配的点再进行一次挑选
%
% % max_itera=50; %设置最大迭代次数
% % sigma=4; %设置拟合矩阵[m11,m12,m13;m21,m22,m23;0,0,1]还原的偏差
% % pretotal=0; %符合拟合模型的数据的个数
% % k=0;
% % while pretotal <= size(dis_ratio2_s,1)*0.75 && k<max_itera %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
% % SampIndex=round(1+(size(dis_ratio2_s,1)-1)*rand(3,1)); %产生三个随机索引,找样本用,floor向下取整
% %
% % samp1_tmp=dis_ratio2_s(SampIndex,4); %对原数据随机抽样两个样本
% % samp2_tmp=dis_ratio2_s(SampIndex,5);
% %
% % samp1=[Ipts1_impv(samp1_tmp).x;Ipts1_impv(samp1_tmp).y];
% % samp2=[Ipts3(samp2_tmp).x;Ipts3(samp2_tmp).y];
% %
% % att_matr=Matrix_solv(samp1,samp2); %对两组数据拟合出矩阵,或其他变种拟合方法
% % total=0;dis_ratio3=[];
% % for j=1:size(dis_ratio2_s,1)
% % x_ini=Ipts1_impv(dis_ratio2_s(j,4)).x;y_ini=Ipts1_impv(dis_ratio2_s(j,4)).y;
% % x_atk=Ipts3(dis_ratio2_s(j,5)).x;y_atk=Ipts3(dis_ratio2_s(j,5)).y;
% % tmp=att_matr*[x_atk;y_atk;1];
% % x_red=tmp(1);y_red=tmp(2);
% % if sqrt((x_ini-x_red)^2+(y_ini-y_red)^2)<sigma
% % total=total+1;
% % dis_ratio3=[dis_ratio3;dis_ratio2_s(j,:)];
% % end
% % end
% % % mask=abs(line*[data ones(size(data,1),1)]'); %求每个数据到拟合直线的距离
% % % total=sum(mask<sigma); %计算数据距离直线小于一定阈值的数据的个数
% %
% % if total>pretotal %找到符合拟合矩阵数据最多的拟合矩阵
% % pretotal=total;
% % bestmatr=att_matr; %找到最好的拟合矩阵
% % best_disratio_s=dis_ratio3; %找到最符合条件的那些坐标
% % end
% % k=k+1;
% % end
%
% % Sort matches on vector distance
% % [err, ind]=sort(err);
% cor1_s4=dis_ratio2_s4(:,4);
% cor3_s4=dis_ratio2_s4(:,5);
%
% % Make vectors with the coordinates of the best matches
% Pos1_s4=[[Ipts1_impv(cor1_s4).y]',[Ipts1_impv(cor1_s4).x]'];
% Pos3_s4=[[Ipts4(cor3_s4).y]',[Ipts4(cor3_s4).x]'];
%
% I = zeros([1.5*size(I1,1) size(I1,2)*2.5 ]);
% I(1:size(I1,1),1:size(I1,2))=im2uint8(I1); I(1:size(I4,1),size(I1,2)+1:size(I1,2)+size(I4,2))=I4;
% figure, imshow(I,[]),title('缩放校正后再进行一次特征点匹配'); hold on;
%
% % Show the best matches
% plot([Pos1_s4(:,2) Pos3_s4(:,2)+size(I1,2)]',[Pos1_s4(:,1) Pos3_s4(:,1)]','-');
% plot([Pos1_s4(:,2) Pos3_s4(:,2)+size(I1,2)]',[Pos1_s4(:,1) Pos3_s4(:,1)]','o');
%
% Pos3_l4=length(Pos3_s4);
% dis_stor_s4=zeros(Pos3_l4*(Pos3_l4-1)/2,3); %第一列记录两坐标间的距离,第二列记录受攻击后图像起始坐标序号,第三列记录终点坐标序号
% Pos1_s4(:,3)=1:Pos3_l4; Pos3_s4(:,3)=1:Pos3_l4;
%
% Pos1_tc=Pos1_s4;
% Pos4_tc=Pos3_s4;
% % dis_ratio2_tc=dis_ratio2_s;
% % dis_coor_tc=dis_coor_s;
% % point=20;
% x_tc_cnt4=zeros(length(Pos1_tc),1);y_tc_cnt4=zeros(length(Pos4_tc),1);
% for i=1:length(Pos1_tc)
%
% x1_tc=Pos1_tc(i,1);y1_tc=Pos1_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x1_tca=Pos4_tc(i,1);y1_tca=Pos4_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x_tcd=x1_tca-x1_tc;y_tcd=y1_tca-y1_tc;
% x_tc_cnt4(i)=x_tcd;y_tc_cnt4(i)=y_tcd;
% end
%
% x_tcd_sort4=sort(x_tc_cnt4);y_tcd_sort4=sort(y_tc_cnt4);
% devi=0.075;
% m=0;n=0;
% med_vaule=round(length(Pos1_tc)/2);
% for i=1:length(Pos1_tc)
% if abs(x_tcd_sort4(i))>=abs(x_tcd_sort4(med_vaule))*(1-devi)&&abs(x_tcd_sort4(i))<=abs(x_tcd_sort4(med_vaule))*(1+devi)
% m=m+1;
% x_tcd_fil4(m)=x_tcd_sort4(i);
% end
% if abs(y_tcd_sort4(i))>=abs(y_tcd_sort4(med_vaule))*(1-devi)&&abs(y_tcd_sort4(i))<=abs(y_tcd_sort4(med_vaule))*(1+devi)
% n=n+1;
% y_tcd_fil4(n)=y_tcd_sort4(i);
% end
% end
% x_tcd_init4=sum(x_tcd_fil4)/length(x_tcd_fil4);
% y_tcd_init4=sum(y_tcd_fil4)/length(y_tcd_fil4);
% x_tcd_init4
% y_tcd_init4
%
%
% TC_thresh1=1.5;
% if abs(x_tcd_init4)>=TC_thresh1||abs(y_tcd_init4)>=TC_thresh1
% disp('有平移攻击(且有缩放攻击)');
% Trans_flag=1;
% Rotcrp_flag=1; %%剪切也是平移的一种
% x_tcd_rev=round(-x_tcd_init4);y_tcd_rev=round(-y_tcd_init4);
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I4= imdilate(I4,se);
% figure,imshow(uint8(I4),[ ]),title('平移粗略校正后的图像(且带缩放)');
% end
% end
% % thet_count(m,1)=atan((x2_ad*x3_d-x2_d*x3_ad)/(y2_ad*x3_d-x2_d*y3_ad));
% % end
%
%
% % 将图像黑色背景和过渡的那一两行去掉
% % 备注:此种去除黑色背景的方法有问题,必须改进,可能把图片中间的某行或某列去除了
% [ro4,co4]=size(I4);
% % I4=im2uint8(I4);
% if (ro4==co4&&ro4==512)||(Sca_flag==1&&Rot_flag==0)||Trans_flag==1
% I5=I4;
% else
% m=0;I4_1=[];
% for i=1:ro4
% if sum(uint8(I4(i,:)))>512*40
% m=m+1;
% I4_1(m,:)=I4(i,:);
% end
% end
% n=0;
% for i=1:co4
% if sum(I4_1(:,i))>512*40
% n=n+1;
% I5(:,n)=I4_1(:,i);
% end
% end
% end
% % figure,imshow(I5,[]);title('去除黑色背景后的RS校正图像');
%
%
% %% 首先在空域寻找嵌入特殊信息的位置块,以便定位到边缘被破坏的图片的边界以及再一次精准校正
% if Sca_flag==1||Sca_flag_un==1;
% Nc_total=[];nc_coord_tal=[];coord_avg=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I5,coordx,coordy,flg_grp(1,:));
% Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(2,:));
% Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I5,coordx,coordy,flg_grp(3,:));
% % Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(4,:));
% Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I5,coordx,coordy,flg_grp(5,:));
% Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
%
% %%利用特殊位置的点相对距离求出像素的偏差,并且再一次精准校正
% x1x4_dis=coord_avg(3,1)-coord_avg(1,1);
% x2x5_dis=coord_avg(4,1)-coord_avg(2,1);
% x_devi=(438-(x1x4_dis+x2x5_dis)*0.5)/(438/512); %若x_devi为正则需要放大,为负则需要缩小
% y1y4_dis=coord_avg(2,2)-coord_avg(1,2);
% y2y5_dis=coord_avg(4,2)-coord_avg(3,2);
% y_devi=(438-(y1y4_dis+y2y5_dis)*0.5)/(438/512); %若y_devi为正则需要放大,为负则需要缩小
% [ro5,co5]=size(I5);
% ro6=round(x_devi)+ro5;co6=round(y_devi)+co5;
% I6=imresize(I5,[ro6 co6],'bicubic');
% Sx_rv2(num,1)=-x_devi/rm;
% Sy_rv2(num,1)=-y_devi/cm;
% Sx_un1=Sx_rv2(num,1);
% Sy_un1=Sy_rv2(num,1);
% Sx_un1
% Sy_un1
% if Sca_flag_un==1
% S_un_rv2(num,1)=-(x_devi+y_devi)/(2.0*cm);
% S_un1=S_un_rv2(num,1);
% S_un1
% end
% end
%
% %% 角度的精细校正,此处特别注意,需分四种情况:1、只有imrotate攻击;2、同时有imrotate和scale攻击;3、同时有imrotate和imcrop攻击;4、同时有imrotate、scale、imcrop攻击
% if (Rot_flag==1&&Rotcrp_flag==0)&&Sca_flag==0
% % I3=im2uint8(I3);
% % [ro3,co3]=size(I3);
% % m=0;I3_1=[];
% % for i=1:ro3
% % if sum(uint8(I3(i,:)))>460*40
% % m=m+1;
% % I3_1(m,:)=I3(i,:);
% % end
% % end
% % n=0;
% % for i=1:co3
% % if sum(I3_1(:,i))>460*40
% % n=n+1;
% % I3_2(:,n)=I3_1(:,i);
% % end
% % end
% % I3=I3_2;
% %%% 利用坐标来校正角度
% Nc_total5=[];nc_coord_tal5=[];coord_avg5=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I5,coordx,coordy,flg_grp(1,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(2,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I5,coordx,coordy,flg_grp(3,:));
% % Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(4,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I5,coordx,coordy,flg_grp(5,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
%
% %%利用特殊位置的点相对距离求出像素的偏差,并且再一次对角度精准校正
% x1x3_dis=abs(coord_avg5(3,1)-coord_avg5(1,1));y1y3_dis=coord_avg5(3,2)-coord_avg5(1,2);
% angle1=atand(y1y3_dis/x1x3_dis);
% x3x4_dis=coord_avg5(4,1)-coord_avg5(3,1);y3y4_dis=abs(coord_avg5(4,2)-coord_avg5(3,2));
% angle2=atand(-x3x4_dis/y3y4_dis);
% x4x2_dis=abs(coord_avg5(2,1)-coord_avg5(4,1));y4y2_dis=coord_avg5(2,2)-coord_avg5(4,2);
% angle3=atand(-y4y2_dis/x4x2_dis);
% x2x1_dis=coord_avg5(1,1)-coord_avg5(2,1);y2y1_dis=abs(coord_avg5(1,2)-coord_avg5(2,2));
% angle4=atand(x2x1_dis/y2y1_dis);
% angle_avg=(angle1+angle2+angle3+angle4)/4;
% disp('角度精确矫正的值')
% angle_avg
% I5=imrotate(I5,-angle_avg,'bicubic');
% %%% 再一次去掉边界部分
% [ro5,co5]=size(I5);
% m=0;I5_1=[];
% for i=1:ro5
% if sum(uint8(I5(i,:)))>460*40
% m=m+1;
% I5_1(m,:)=uint8(I5(i,:));
% end
% end
% n=0;
% for i=1:co5
% if sum(I5_1(:,i))>460*40
% n=n+1;
% I5_2(:,n)=I5_1(:,i);
% end
% end
% I5=I5_2;
% end
%
% if Rot_flag==1&&Sca_flag==1 %%同时有imrotate、scale、攻击,可能有imcrop攻击,此时的imcrop攻击包含Translate攻击
% %%% 利用坐标来校正角度
% Nc_total6=[];nc_coord_tal6=[];coord_avg6=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I6,coordx,coordy,flg_grp(1,:));
% Nc_total6=[Nc_total6;Nc_sta];nc_coord_tal6=[nc_coord_tal6;nc_coord_alt];coord_avg6=[coord_avg6;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I6,coordx,coordy,flg_grp(2,:));
% Nc_total6=[Nc_total6;Nc_sta];nc_coord_tal6=[nc_coord_tal6;nc_coord_alt];coord_avg6=[coord_avg6;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I6,coordx,coordy,flg_grp(4,:));
% Nc_total6=[Nc_total6;Nc_sta];nc_coord_tal6=[nc_coord_tal6;nc_coord_alt];coord_avg6=[coord_avg6;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I6,coordx,coordy,flg_grp(5,:));
% Nc_total6=[Nc_total6;Nc_sta];nc_coord_tal6=[nc_coord_tal6;nc_coord_alt];coord_avg6=[coord_avg6;coord_x_y];
%
% %%利用特殊位置的点相对距离求出像素的偏差,并且再一次对角度精准校正
% x1x3_dis=abs(coord_avg6(3,1)-coord_avg6(1,1));y1y3_dis=coord_avg6(3,2)-coord_avg6(1,2);
% angle1=atand(y1y3_dis/x1x3_dis);
% x3x4_dis=coord_avg6(4,1)-coord_avg6(3,1);y3y4_dis=abs(coord_avg6(4,2)-coord_avg6(3,2));
% angle2=atand(-x3x4_dis/y3y4_dis);
% x4x2_dis=abs(coord_avg6(2,1)-coord_avg6(4,1));y4y2_dis=coord_avg6(2,2)-coord_avg6(4,2);
% angle3=atand(-y4y2_dis/x4x2_dis);
% x2x1_dis=coord_avg6(1,1)-coord_avg6(2,1);y2y1_dis=abs(coord_avg6(1,2)-coord_avg6(2,2));
% angle4=atand(x2x1_dis/y2y1_dis);
% angle_avg=(angle1+angle2+angle3+angle4)/4;
% disp('角度精确矫正的值')
% angle_avg
% I6=imrotate(I6,-angle_avg,'bicubic');
% %%% 再一次去掉边界部分
% [ro6,co6]=size(I6);
% m=0;I6_1=[];
% for i=1:ro6
% if sum(uint8(I6(i,:)))>512*10
% m=m+1;
% I6_1(m,:)=uint8(I6(i,:));
% end
% end
% n=0;
% for i=1:co6
% if sum(I6_1(:,i))>512*10
% n=n+1;
% I6_2(:,n)=I6_1(:,i);
% end
% end
% I6=I6_2;
% end
%
% %%% imrotate和imcrop攻击同时存在,但没有缩放
% if (Rot_flag==1&&Rotcrp_flag==1)&&Sca_flag==0
%
% %%% 利用坐标来校正角度
% Nc_total5=[];nc_coord_tal5=[];coord_avg5=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I5,coordx,coordy,flg_grp(1,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(2,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I5,coordx,coordy,flg_grp(3,:));
% % Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I5,coordx,coordy,flg_grp(4,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I5,coordx,coordy,flg_grp(5,:));
% Nc_total5=[Nc_total5;Nc_sta];nc_coord_tal5=[nc_coord_tal5;nc_coord_alt];coord_avg5=[coord_avg5;coord_x_y];
%
% %%利用特殊位置的点相对距离求出像素的偏差,并且再一次对角度精准校正
% x1x3_dis=abs(coord_avg5(3,1)-coord_avg5(1,1));y1y3_dis=coord_avg5(3,2)-coord_avg5(1,2);
% angle1=atand(y1y3_dis/x1x3_dis);
% x3x4_dis=coord_avg5(4,1)-coord_avg5(3,1);y3y4_dis=abs(coord_avg5(4,2)-coord_avg5(3,2));
% angle2=atand(-x3x4_dis/y3y4_dis);
% x4x2_dis=abs(coord_avg5(2,1)-coord_avg5(4,1));y4y2_dis=coord_avg5(2,2)-coord_avg5(4,2);
% angle3=atand(-y4y2_dis/x4x2_dis);
% x2x1_dis=coord_avg5(1,1)-coord_avg5(2,1);y2y1_dis=abs(coord_avg5(1,2)-coord_avg5(2,2));
% angle4=atand(x2x1_dis/y2y1_dis);
% angle_avg=(angle1+angle2+angle3+angle4)/4;
% disp('角度精确矫正的值')
% angle_avg
% I5=imrotate(I5,-angle_avg,'bicubic');
% %%% 再一次去掉边界部分
% [ro5,co5]=size(I5);
% m=0;I5_1=[];
% for i=1:ro5
% if sum(uint8(I5(i,:)))>460*20
% m=m+1;
% I5_1(m,:)=uint8(I5(i,:));
% end
% end
% n=0;
% for i=1:co5
% if sum(I5_1(:,i))>460*20
% n=n+1;
% I5_2(:,n)=I5_1(:,i);
% end
% end
% I5=I5_2;
% end
% if Rot_flag==1
% thet_rv2(num,1)=angle_avg;
% end
% %% 平移或剪切的校正。如果没有Scale攻击同时没有Rotate攻击则无需再次进行特征点的匹配;
% % 若有,则经过粗校正和精确校正的图片必须再次进行特征点的匹配,检查X,Y坐标的变化情况
% Crop_flag=0;
% if Sca_flag==0&&Rot_flag==0
% I5=im2double(uint8(I5));
% Ipts5=OpenSurf(I5,Options);
%
% % Ipts4=OpenSurf(im2double(uint8(I4)),Options);
% D5 = reshape([Ipts5.descriptor],64,[]);
%
% % Find the best matches
%
% % matches,最近邻次近邻比值的阈值设定法挑选,Ransac算法再进行一次挑选,是否要用到最小二乘法拟合那个矩阵???
% err_s5=zeros(1,length(Ipts1_impv));
% % cor1=1:length(Ipts1_impv);
% cor_s5=zeros(1,length(Ipts1_impv));
% ratio_s5=zeros(length(Ipts1_impv),1);
% dis_store_s5=zeros(length(Ipts1_impv),2);
% dis_ratio_s5=zeros(length(Ipts1_impv),5);
% for i=1:length(Ipts1_impv)
% distance=sum((D5-repmat(D1(:,i),[1 length(Ipts5)])).^2,1);
% dis_sort_s5=sort(distance,'ascend');
% dis_store_s5(i,:)=[dis_sort_s5(1),dis_sort_s5(2),];
% ratio_s5(i)=dis_sort_s5(1)/dis_sort_s5(2);
% [err_s5(i),cor_s5(i)]=min(distance);
% dis_ratio_s5(i,:)=[dis_store_s5(i,:) ratio_s5(i) i cor_s5(i)];
% end
%
% dis_ratio1_s5=sortrows(dis_ratio_s5,3);
% mask1=dis_ratio1_s5(:,3)<=0.65;
% dis_ratio2_s5=zeros(sum(mask1),5);
% nn=0;
% for i=1:length(dis_ratio1_s5)
% if mask1(i)
% nn=nn+1;
% dis_ratio2_s5(nn,:)=dis_ratio1_s5(i,:);
% end
% end
%
% % 利用Ransac算法对匹配的点再进行一次挑选
%
% % max_itera=50; %设置最大迭代次数
% % sigma=4; %设置拟合矩阵[m11,m12,m13;m21,m22,m23;0,0,1]还原的偏差
% % pretotal=0; %符合拟合模型的数据的个数
% % k=0;
% % while pretotal <= size(dis_ratio2_s,1)*0.75 && k<max_itera %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
% % SampIndex=round(1+(size(dis_ratio2_s,1)-1)*rand(3,1)); %产生三个随机索引,找样本用,floor向下取整
% %
% % samp1_tmp=dis_ratio2_s(SampIndex,4); %对原数据随机抽样两个样本
% % samp2_tmp=dis_ratio2_s(SampIndex,5);
% %
% % samp1=[Ipts1_impv(samp1_tmp).x;Ipts1_impv(samp1_tmp).y];
% % samp2=[Ipts3(samp2_tmp).x;Ipts3(samp2_tmp).y];
% %
% % att_matr=Matrix_solv(samp1,samp2); %对两组数据拟合出矩阵,或其他变种拟合方法
% % total=0;dis_ratio3=[];
% % for j=1:size(dis_ratio2_s,1)
% % x_ini=Ipts1_impv(dis_ratio2_s(j,4)).x;y_ini=Ipts1_impv(dis_ratio2_s(j,4)).y;
% % x_atk=Ipts3(dis_ratio2_s(j,5)).x;y_atk=Ipts3(dis_ratio2_s(j,5)).y;
% % tmp=att_matr*[x_atk;y_atk;1];
% % x_red=tmp(1);y_red=tmp(2);
% % if sqrt((x_ini-x_red)^2+(y_ini-y_red)^2)<sigma
% % total=total+1;
% % dis_ratio3=[dis_ratio3;dis_ratio2_s(j,:)];
% % end
% % end
% % % mask=abs(line*[data ones(size(data,1),1)]'); %求每个数据到拟合直线的距离
% % % total=sum(mask<sigma); %计算数据距离直线小于一定阈值的数据的个数
% %
% % if total>pretotal %找到符合拟合矩阵数据最多的拟合矩阵
% % pretotal=total;
% % bestmatr=att_matr; %找到最好的拟合矩阵
% % best_disratio_s=dis_ratio3; %找到最符合条件的那些坐标
% % end
% % k=k+1;
% % end
%
% % Sort matches on vector distance
% % [err, ind]=sort(err);
% cor1_s1=dis_ratio2_s5(:,4);
% cor3_s5=dis_ratio2_s5(:,5);
%
% % Make vectors with the coordinates of the best matches
% Pos1_s5=[[Ipts1_impv(cor1_s1).y]',[Ipts1_impv(cor1_s1).x]'];
% Pos3_s5=[[Ipts5(cor3_s5).y]',[Ipts5(cor3_s5).x]'];
%
% I5=im2uint8(I5);
% I = zeros([1.5*size(I1,1) size(I1,2)*2.5 ]);
% I(1:size(I1,1),1:size(I1,2))=im2uint8(I1); I(1:size(I5,1),size(I1,2)+1:size(I1,2)+size(I5,2))=I5;
% figure, imshow(I,[]),title('缩放校正后再进行一次特征点匹配'); hold on;
%
% % Show the best matches
% plot([Pos1_s5(:,2) Pos3_s5(:,2)+size(I1,2)]',[Pos1_s5(:,1) Pos3_s5(:,1)]','-');
% plot([Pos1_s5(:,2) Pos3_s5(:,2)+size(I1,2)]',[Pos1_s5(:,1) Pos3_s5(:,1)]','o');
%
% Pos3_l5=length(Pos3_s5);
% dis_stor_s5=zeros(Pos3_l5*(Pos3_l5-1)/2,3); %第一列记录两坐标间的距离,第二列记录受攻击后图像起始坐标序号,第三列记录终点坐标序号
% Pos1_s5(:,3)=1:Pos3_l5; Pos3_s5(:,3)=1:Pos3_l5;
%
% Pos1_tc=Pos1_s5;
% Pos5_tc=Pos3_s5;
% % dis_ratio2_tc=dis_ratio2_s;
% % dis_coor_tc=dis_coor_s;
% % point=20;
% x_tc_cnt4=zeros(length(Pos1_tc),1);y_tc_cnt4=zeros(length(Pos5_tc),1);
% for i=1:length(Pos1_tc)
%
% x1_tc=Pos1_tc(i,1);y1_tc=Pos1_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x1_tca=Pos5_tc(i,1);y1_tca=Pos5_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x_tcd=x1_tca-x1_tc;y_tcd=y1_tca-y1_tc;
% x_tc_cnt4(i)=x_tcd;y_tc_cnt4(i)=y_tcd;
% end
%
% x_tcd_sort4=sort(x_tc_cnt4);y_tcd_sort4=sort(y_tc_cnt4);
% devi=0.075;
% m=0;n=0;
% med_vaule=round(length(Pos1_tc)/2);
% for i=1:length(Pos1_tc)
% if abs(x_tcd_sort4(i))>=abs(x_tcd_sort4(med_vaule))*(1-devi)&&abs(x_tcd_sort4(i))<=abs(x_tcd_sort4(med_vaule))*(1+devi)
% m=m+1;
% x_tcd_fil4(m)=x_tcd_sort4(i);
% end
% if abs(y_tcd_sort4(i))>=abs(y_tcd_sort4(med_vaule))*(1-devi)&&abs(y_tcd_sort4(i))<=abs(y_tcd_sort4(med_vaule))*(1+devi)
% n=n+1;
% y_tcd_fil4(n)=y_tcd_sort4(i);
% end
% end
% x_tcd_init=sum(x_tcd_fil4)/length(x_tcd_fil4);
% y_tcd_init=sum(y_tcd_fil4)/length(y_tcd_fil4);
% x_tcd_init
% y_tcd_init
%
% % Pos1_tc=Pos1_s;
% % Pos4_tc=Pos3_s;
% % % dis_ratio2_tc=dis_ratio2_s;
% % % dis_coor_tc=dis_coor_s;
% % % point=20;
% % x_tc_cnt=zeros(length(Pos1_tc),1);y_tc_cnt=zeros(length(Pos4_tc),1);
% % for i=1:length(Pos1_tc)
% %
% % x1_tc=Pos1_tc(i,1);y1_tc=Pos1_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% % % x2_tc=Pos1_tc(dis_coor_tc(i,3),1);y2_tc=Pos1_tc(dis_coor_tc(i,3),2); % 通过旋转Haar小波模板求响应值,将X,Y的坐标对调了
% % % x3=coord_ini(selt2(i+1),1);y3=coord_ini(selt2(i+1),2);
% % x1_tca=Pos4_tc(i,1);y1_tca=Pos4_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% % % x2_tca=Pos3_tc(dis_coor_tc(i,3),1);y2_tca=Pos3_tc(dis_coor_tc(i,3),2);
% % % x3_a=coord_attk(selt2(i+1),1);y3_a=coord_attk(selt2(i+1),2);
% % x_tcd=x1_tca-x1_tc;y_tcd=y1_tca-y1_tc;
% % % x_norm=x_d/sqrt(x_d^2+y_d^2);y_norm=y_d/sqrt(x_d^2+y_d^2); %%旋转前的向量坐标归一化
% % x_tc_cnt(i)=x_tcd;y_tc_cnt(i)=y_tcd;
% %
% % end
% % x_tcd_sort=sort(x_tc_cnt);y_tcd_sort=sort(y_tc_cnt);
% % devi=0.050;
% % m=0;n=0;
% % med_vaule=round(length(Pos1_tc)/2);
% % for i=1:length(Pos1_tc)
% % if abs(x_tcd_sort(i))>=abs(x_tcd_sort(med_vaule))*(1-devi)&&abs(x_tcd_sort(i))<=abs(x_tcd_sort(med_vaule))*(1+devi)
% % m=m+1;
% % x_tcd_fil(m)=x_tcd_sort(i);
% % end
% % if abs(y_tcd_sort(i))>=abs(y_tcd_sort(med_vaule))*(1-devi)&&abs(y_tcd_sort(i))<=abs(y_tcd_sort(med_vaule))*(1+devi)
% % n=n+1;
% % y_tcd_fil(n)=y_tcd_sort(i);
% % end
% % end
% % x_tcd_init=sum(x_tcd_fil)/length(x_tcd_fil);
% % y_tcd_init=sum(y_tcd_fil)/length(y_tcd_fil);
% % x_tcd_init
% % y_tcd_init
%
% % 没有剪切和平移的攻击
% TC_thresh=0.8;
%
% if abs(x_tcd_init)<=TC_thresh&&abs(y_tcd_init)<=TC_thresh
% disp('无剪切和平移攻击');
% Crop_flag=0;Trans_flag=0;
% I7=I5;
% end
%
% % 只有剪切(或同时沿X轴负方向、Y轴负方向的平移)
% if x_tcd_init<=-TC_thresh&&y_tcd_init<=-TC_thresh
% Crop_flag=1;
% [ro5,co5]=size(I5);
% if ro5==co5&&ro5==512
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I7= imdilate(I5,se);
% figure,imshow(uint8(I7),[ ]),title('平移校正后的图像');
% else
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% I7=zeros(512,512);
% I7(1+x_tcd_rev:ro5+x_tcd_rev,1+y_tcd_rev:co5+y_tcd_rev)=I5;
% end
% elseif (x_tcd_init)>=TC_thresh&&y_tcd_init>=TC_thresh %%同时沿X轴正方向、Y轴正方向的平移
% Trans_flag=1;
% disp('沿X轴正方向、Y轴正方向的平移');
% [ro5,co5]=size(I5);
% if ro5==co5&&ro5==512
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I7= imdilate(I5,se);
% figure,imshow(uint8(I7),[ ]),title('平移校正后的图像');
% elseif ro5<512&&co5<512
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% I7=zeros(512,512);
% I7(1+x_tcd_rev:ro5+x_tcd_rev,1+y_tcd_rev:co5+y_tcd_rev)=I5; %%这是为了兼容剪切攻击的,那么怎样兼容LGT/LT、Shearing攻击呢??
% elseif ro5~=512||co5~=512
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init); %%兼容LGT/LT、Shearing攻击呢
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I7= imdilate(I5,se);
% figure,imshow(uint8(I7),[ ]),title('平移校正后的图像');
% end
%
% end
% % X,Y方向不一致的平移攻击
% if (abs(x_tcd_init)>=TC_thresh&&abs(y_tcd_init)>=TC_thresh)&&y_tcd_init*x_tcd_init<=0
% disp('有平移攻击');
% Trans_flag=1;
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I7= imdilate(I5,se);
% figure,imshow(uint8(I7),[ ]),title('平移校正后的图像');
% end
% % thet_count(m,1)=atan((x2_ad*x3_d-x2_d*x3_ad)/(y2_ad*x3_d-x2_d*y3_ad));
% end
%
% %%% 同时有缩放和平移攻击或RST的组合攻击都有,缩放攻击已经过粗校正和精细校正,所以必须再次进行特征点的匹配,以进行平移的精确校正,
% %%% 备注:平移的精确校正其实有点没必要,因为搜索范围是一个16*16的区域,平移可以不同精确校正
% % if (Sca_flag==1&&Rot_flag==0)||Rot_flag==1
% % if Rot_flag==1&&Sca_flag==0
% % I6=I5;
% % end
%
% %%% 同时有缩放和平移攻击或RST的组合攻击都有,缩放攻击已经过粗校正和精细校正,所以必须再次进行特征点的匹配,以进行平移的精确校正,
% %%% 备注:平移的精确校正其实有点没必要,因为搜索范围是一个16*16的区域,平移可以不同精确校正
% % if (Sca_flag==1&&Rot_flag==0)||Rot_flag==1
% % if Rot_flag==1&&Sca_flag==0
% % I6=I5;
% % end
% if Sca_flag==1&&Rot_flag==0
%
% Ipts6=OpenSurf(im2double(uint8(I6)),Options);
% D6 = reshape([Ipts6.descriptor],64,[]);
%
% % Find the best matches
%
% % matches,最近邻次近邻比值的阈值设定法挑选,Ransac算法再进行一次挑选,是否要用到最小二乘法拟合那个矩阵???
% err_s6=zeros(1,length(Ipts1_impv));
% % cor1=1:length(Ipts1_impv);
% cor_s6=zeros(1,length(Ipts1_impv));
% ratio_s6=zeros(length(Ipts1_impv),1);
% dis_store_s6=zeros(length(Ipts1_impv),2);
% dis_ratio_s6=zeros(length(Ipts1_impv),5);
% for i=1:length(Ipts1_impv)
% distance=sum((D6-repmat(D1(:,i),[1 length(Ipts6)])).^2,1);
% dis_sort_s6=sort(distance,'ascend');
% dis_store_s6(i,:)=[dis_sort_s6(1),dis_sort_s6(2),];
% ratio_s6(i)=dis_sort_s6(1)/dis_sort_s6(2);
% [err_s6(i),cor_s6(i)]=min(distance);
% dis_ratio_s6(i,:)=[dis_store_s6(i,:) ratio_s6(i) i cor_s6(i)];
% end
%
% dis_ratio1_s6=sortrows(dis_ratio_s6,3);
% mask1=dis_ratio1_s6(:,3)<=0.65;
% dis_ratio2_s6=zeros(sum(mask1),5);
% nn=0;
% for i=1:length(dis_ratio1_s6)
% if mask1(i)
% nn=nn+1;
% dis_ratio2_s6(nn,:)=dis_ratio1_s6(i,:);
% end
% end
%
% % 利用Ransac算法对匹配的点再进行一次挑选
%
% % max_itera=50; %设置最大迭代次数
% % sigma=4; %设置拟合矩阵[m11,m12,m13;m21,m22,m23;0,0,1]还原的偏差
% % pretotal=0; %符合拟合模型的数据的个数
% % k=0;
% % while pretotal <= size(dis_ratio2_s,1)*0.75 && k<max_itera %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
% % SampIndex=round(1+(size(dis_ratio2_s,1)-1)*rand(3,1)); %产生三个随机索引,找样本用,floor向下取整
% %
% % samp1_tmp=dis_ratio2_s(SampIndex,4); %对原数据随机抽样两个样本
% % samp2_tmp=dis_ratio2_s(SampIndex,5);
% %
% % samp1=[Ipts1_impv(samp1_tmp).x;Ipts1_impv(samp1_tmp).y];
% % samp2=[Ipts3(samp2_tmp).x;Ipts3(samp2_tmp).y];
% %
% % att_matr=Matrix_solv(samp1,samp2); %对两组数据拟合出矩阵,或其他变种拟合方法
% % total=0;dis_ratio3=[];
% % for j=1:size(dis_ratio2_s,1)
% % x_ini=Ipts1_impv(dis_ratio2_s(j,4)).x;y_ini=Ipts1_impv(dis_ratio2_s(j,4)).y;
% % x_atk=Ipts3(dis_ratio2_s(j,5)).x;y_atk=Ipts3(dis_ratio2_s(j,5)).y;
% % tmp=att_matr*[x_atk;y_atk;1];
% % x_red=tmp(1);y_red=tmp(2);
% % if sqrt((x_ini-x_red)^2+(y_ini-y_red)^2)<sigma
% % total=total+1;
% % dis_ratio3=[dis_ratio3;dis_ratio2_s(j,:)];
% % end
% % end
% % % mask=abs(line*[data ones(size(data,1),1)]'); %求每个数据到拟合直线的距离
% % % total=sum(mask<sigma); %计算数据距离直线小于一定阈值的数据的个数
% %
% % if total>pretotal %找到符合拟合矩阵数据最多的拟合矩阵
% % pretotal=total;
% % bestmatr=att_matr; %找到最好的拟合矩阵
% % best_disratio_s=dis_ratio3; %找到最符合条件的那些坐标
% % end
% % k=k+1;
% % end
%
% % Sort matches on vector distance
% % [err, ind]=sort(err);
% cor1_s6=dis_ratio2_s6(:,4);
% cor3_s6=dis_ratio2_s6(:,5);
%
% % Make vectors with the coordinates of the best matches
% Pos1_s6=[[Ipts1_impv(cor1_s6).y]',[Ipts1_impv(cor1_s6).x]'];
% Pos3_s6=[[Ipts6(cor3_s6).y]',[Ipts6(cor3_s6).x]'];
%
% I = zeros([1.5*size(I1,1) size(I1,2)*2.5 ]);
% I(1:size(I1,1),1:size(I1,2))=im2uint8(I1); I(1:size(I6,1),size(I1,2)+1:size(I1,2)+size(I6,2))=I6;
% figure, imshow(I,[]),title('尺度校正后再进行一次特征点匹配'); hold on;
%
% % Show the best matches
% plot([Pos1_s6(:,2) Pos3_s6(:,2)+size(I1,2)]',[Pos1_s6(:,1) Pos3_s6(:,1)]','-');
% plot([Pos1_s6(:,2) Pos3_s6(:,2)+size(I1,2)]',[Pos1_s6(:,1) Pos3_s6(:,1)]','o');
%
% Pos3_l6=length(Pos3_s6);
% dis_stor_s6=zeros(Pos3_l6*(Pos3_l6-1)/2,3); %第一列记录两坐标间的距离,第二列记录受攻击后图像起始坐标序号,第三列记录终点坐标序号
% Pos1_s6(:,3)=1:Pos3_l6; Pos3_s6(:,3)=1:Pos3_l6;
%
% Pos1_tc=Pos1_s6;
% Pos4_tc=Pos3_s6;
% % dis_ratio2_tc=dis_ratio2_s;
% % dis_coor_tc=dis_coor_s;
% % point=20;
% x_tc_cnt=zeros(length(Pos1_tc),1);y_tc_cnt=zeros(length(Pos4_tc),1);
% for i=1:length(Pos1_tc)
%
% x1_tc=Pos1_tc(i,1);y1_tc=Pos1_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x1_tca=Pos4_tc(i,1);y1_tca=Pos4_tc(i,2); % 此处特别注意,其实在利用SURF算法时,其中有一步
% x_tcd=x1_tca-x1_tc;y_tcd=y1_tca-y1_tc;
% x_tc_cnt(i)=x_tcd;y_tc_cnt(i)=y_tcd;
% end
%
% x_tcd_sort=sort(x_tc_cnt);y_tcd_sort=sort(y_tc_cnt);
% devi=0.075;
% m=0;n=0;
% med_vaule=round(length(Pos1_tc)/2);
% for i=1:length(Pos1_tc)
% if abs(x_tcd_sort(i))>=abs(x_tcd_sort(med_vaule))*(1-devi)&&abs(x_tcd_sort(i))<=abs(x_tcd_sort(med_vaule))*(1+devi)
% m=m+1;
% x_tcd_fil(m)=x_tcd_sort(i);
% end
% if abs(y_tcd_sort(i))>=abs(y_tcd_sort(med_vaule))*(1-devi)&&abs(y_tcd_sort(i))<=abs(y_tcd_sort(med_vaule))*(1+devi)
% n=n+1;
% y_tcd_fil(n)=y_tcd_sort(i);
% end
% end
% x_tcd_init=sum(x_tcd_fil)/length(x_tcd_fil);
% y_tcd_init=sum(y_tcd_fil)/length(y_tcd_fil);
% x_tcd_init
% y_tcd_init
%
% % 没有剪切和平移的攻击
% TC_thresh1=1.5;
% if abs(x_tcd_init)<=TC_thresh1&&abs(y_tcd_init)<=TC_thresh1
% disp('缩放和平移攻击都有,但平移经粗略校正即可');
% Crop_flag=0;Trans_flag=0;
% I7=uint8(I6);
% end
%
% % % 只有剪切(或同时沿X轴负方向、Y轴负方向的平移)(剪切和缩放的组合攻击不做)
% % if abs(x_tcd_init)>=1.0&&abs(y_tcd_init)>=1.0
% % Crop_flag=1;
% % [ro6,co6]=size(I6);
% % if ro6==co6&&ro6==512
% % x_tcd_rev=round(-x_tcd_init);y_td_rev=round(-y_tcd_init);
% % se = translate(strel(1), [x_tcd_rev y_td_rev]);
% % I7= imdilate(I6,se);
% % figure,imshow(uint8(I7),[ ]),title('平移校正后的图像');
% % else
% % I7=zeros(512,512);
% % I7(1-x_tcd_rev:ro6-x_tcd_rev,1-y_tcd_rev:co6-y_tcd_rev)=I6;
% % end
% % end
% % 只有平移的攻击
% if abs(x_tcd_init)>=TC_thresh1||abs(y_tcd_init)>=TC_thresh1
% disp('有平移攻击(且有缩放攻击)');
% Trans_flag=1;
% x_tcd_rev=round(-x_tcd_init);y_tcd_rev=round(-y_tcd_init);
% se = translate(strel(1), [x_tcd_rev y_tcd_rev]);
% I7= imdilate(uint8(I6),se);
% figure,imshow(uint8(I7),[ ]),title('平移精确校正后的图像');
% end
% % thet_count(m,1)=atan((x2_ad*x3_d-x2_d*x3_ad)/(y2_ad*x3_d-x2_d*y3_ad));
% end
%
%
% %% 特殊位置的点定位出图像的边界,最重要的是起始点,但是若coord_x_y的x,y均小于25或一个大于25、
% % 另外一个小于25,则怎么办??故而边界上的8*8DCT块不要嵌入信息
% if Crop_flag==0
% if (Sca_flag==1&&Trans_flag==0)||(Sca_flag==1&&Rot_flag==1&&Rotcrp_flag==0)
% I7=uint8(I6); %%仅仅只有Scale攻击或Rotate、Scale的组合攻击,备注:有没有漏掉一些其他的攻击???
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
% elseif (Rot_flag==1)&&(Sca_flag==0&&Trans_flag==0)
% I7=I5;
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
% elseif (Rot_flag==1&&Rotcrp_flag==1)&&Sca_flag==0 % %%imrotate、imcrop的组合攻击,但没有Scale,也包含RT的组合攻击
% I7=I5;
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25-x_tcd_rev;coordy=25-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25-x_tcd_rev;coordy=463-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463-x_tcd_rev;coordy=25-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463-x_tcd_rev;coordy=463-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-x_tcd_rev-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-y_tcd_rev-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_tcd_rev-y_delt 17-x_tcd_rev-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
%
% elseif (Rot_flag==1&&Rotcrp_flag==1)&&Sca_flag==1 % %%imrotate、imcrop的组合攻击,同时有Scale,其实也包含RST组合攻击
% I7=I6;
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25-x_tcd_rev;coordy=25-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25-x_tcd_rev;coordy=463-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463-x_tcd_rev;coordy=25-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463-x_tcd_rev;coordy=463-y_tcd_rev;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-x_tcd_rev-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-y_tcd_rev-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_tcd_rev-y_delt 17-x_tcd_rev-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
% elseif (Rot_flag==0&&Sca_flag==1)&&(Trans_flag==1) % %%删除行列造成的攻击之一,以及ST的组合攻击
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
%
% elseif (Rot_flag==1&&Trans_flag==1) % %%RT、RST的组合攻击,但其实根本没有走到这里,因为Rot_flag==1,其实就是Trans==1
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
% x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
%
% elseif (Rot_flag==0&&Sca_flag==0)&&(Trans_flag==1) % %%删除行列造成的攻击之二,以及只有T的攻击
% Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% coordx=25;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1_1(I7,coordx,coordy,flg_grp(1,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=25;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(2,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=25;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla1(I7,coordx,coordy,flg_grp(4,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% coordx=463;coordy=463;
% [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_pla2(I7,coordx,coordy,flg_grp(5,:));
% Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% %%% 求出x,y坐标起始点的误差
%
% x_delt=25-round((coord_avg7(1,1)+coord_avg7(2,1))/2);y_delt=25-round((coord_avg7(1,2)+coord_avg7(3,2))/2);
% I7_rect=[17-y_delt 17-x_delt 479 479]; %%%特别注意:imcrop函数坐标体系不同于imscale,translate等
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
% elseif (Rot_flag==0&&Sca_flag==0)&&(Trans_flag==0)
% I7_rect=[17 17 479 479];
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
% end
%
% elseif (Crop_flag==1)&&(Sca_flag==0)
% I7_rect=[17 17 479 479];
% % I6_rect=[17 17 479 479];
% I7_crp=imcrop(I7,I7_rect);
% % elseif (Sca_flag==1)&&(Trans_flag==1) %%删除行列造成的攻击之三,以及ST的组合攻击
% % Nc_total7=[];nc_coord_tal7=[];coord_avg7=[];
% % coordx=25;coordy=25;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(1,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=25;coordy=463;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(2,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=247;coordy=247;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(3,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=463;coordy=25;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(4,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % coordx=463;coordy=463;
% % [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I7,coordx,coordy,flg_grp(5,:));
% % Nc_total7=[Nc_total7;Nc_sta];nc_coord_tal7=[nc_coord_tal7;nc_coord_alt];coord_avg7=[coord_avg7;coord_x_y];
% % %%% 求出x,y坐标起始点的误差
% % x_delt=25-round(coord_avg7(1,1));y_delt=25-round(coord_avg7(1,2));
% % I7_rect=[17-x_delt 17-y_delt 479 479];
% % % I6_rect=[17 17 479 479];
% % I7_crp=imcrop(I7,I7_rect);
%
% end
%% 提取版权水印
crc_tran0=cell(len,1);
% wm_ext=zeros(rm_crp/16*cm_crp/16,amt);
m=1;
zt=1; %小波分解级数
wtype = 'haar'; %小波分解类型
[C,S] = wavedec2(I7_crp,zt,wtype);%多尺度二维小波分解
%%尺度1低频与高频系数提取
ca1_6 = appcoef2(C,S,wtype,1); %提取尺度1的低频系数
temp=ca1_6;
[rm2,cm2]=size(ca1_6);
cda0_I6=blkproc(temp,[8 8],'dct2');
for s=1:rm2/8
if m>len
break;
end
for p=1:cm2/8
if m>len
break;
end
x=(s-1)*8;y=(p-1)*8; l=1;
for n=1:im_l
k=rnd1(m,n);
if k==1
d=round(cda0_I6(x+1,y+2)/Q50(1,2));
elseif k==2
d=round(cda0_I6(x+2,y+1)/Q50(2,1));
elseif k==3
d=round(cda0_I6(x+3,y+1)/Q50(3,1));
elseif k==4
d=round(cda0_I6(x+2,y+2)/Q50(2,2));
elseif k==5
d=round(cda0_I6(x+1,y+3)/Q50(1,3));
elseif k==6
d=round(cda0_I6(x+1,y+4)/Q50(1,4));
elseif k==7
d=round(cda0_I6(x+2,y+3)/Q50(2,3));
elseif k==8
d=round(cda0_I6(x+3,y+2)/Q50(3,2));
elseif k==9
d=round(cda0_I6(x+4,y+1)/Q50(4,1));
end
% d1(i,j,n)=d;
if mod(d,2)==0
crc_tran0{m,1}(1,l)='0';
else
crc_tran0{m,1}(1,l)='1';
end
l=l+1;
end
m=m+1;
end
end
% rr=rr+1;
% end
% end
%% 将提取的水印组合成crc6校验所需长度,并且进行校验%%
crc4_att=cell(M,1);
chk_1=2;
temp=(reshape(crc_tran0,chk_1,len/chk_1))';
% un_code=cell(ro*co/10,1);
for i=1:len/chk_1
m=1;
for j=1:chk_1
for k=1:6
crc4_att{i,1}(1,m)=temp{i,j}(1,k);
m=m+1;
end
end
end
det=crc.detector('Polynomial',[1 0 0 0 0 1 1], 'InitialState',[0 0 0 0 0 0], ...
'ReflectInput',false,'ReflectRemainder',false, ...
'FinalXOR', [0 0 0 0 0 0]);
error1=zeros(M,1);
for i=1:M
temp0=bin2dec(crc4_att{i,1});
temp1=de2bi(temp0,12,'left-msb'); %注意:此处只能用de2bi
[outdata error] = detect(det,temp1');
error1(i,1)=error;
if temp0==0
error1(i,1)=1;
end
end
%%检测crc6算法的正确性
error2=ones(M,1);
for i=1:M
if crc4_tmp{i,1}==crc4_att{i,1};
error2(i)=0;
end
end
err=zeros(M,1);
for i=1:M
if error2(i)~=error1(i);
err(i)=1;
end
end
disp('crc6未检测出的错误');
sum(err)
mm=sum(error1);
disp('crc6检测出的错误');
mm
(length(error1)-sum(error1))*6/K
%%未检测到错误的那些包的数据
cc=find(err==1);
cc1=length(cc);
cc2=cell(cc1,1);
for i=1:cc1
cc2{i,1}=crc4_att{cc(i),1};
end
ll=length(error1)-sum(error1);
j=1;
msg_decoded0=cell(ll,1);
for i=1:M
if error1(i,1)==0; %做标志位千万不能用'0'字符类型,否则会出现意想不到的错误
msg_decoded0{j,1}=dec2bin(bin2dec(crc4_att{i,1}),12);
j=j+1;
end
end
msg_decoded=cell(ll*6,1);
nn=1;
for i=1:ll
for j=1:length(crc4_att{1,1})-6
msg_decoded{nn,1}=msg_decoded0{i,1}(1,j);
nn=nn+1;
end
end
% msg_decoded=msg_coded_rev(:,2);
Gen_array=zeros(ll*6,K);
m=1;
for i=1:M
if error1(i,1)==0
Gen_array(6*(m-1)+1:6*(m-1)+6,:)=Gen_array1(6*(i-1)+1:6*(i-1)+6,:);
m=m+1;
end
end
%% LT解码%%
xx=0;
Random_dec_array=cell(K,1);
while xx<=60
xx=xx+1;
if sum(sum(Gen_array))==0
break;
end
for i=1:ll*6
aa=find(Gen_array(i,:)==1);
if isempty(aa)==1
continue;
else
V=aa(1);
kk=length(aa);
if kk==1
Random_dec_array{V,1}=dec2bin(bin2dec(msg_decoded{i,1}),1);
Gen_array(i,V)=0;
pac=find(Gen_array(:,V)==1);
for m=1:length(pac)
temp0=bin2dec(Random_dec_array{V,1});
temp1=bin2dec(msg_decoded{pac(m),1});
temp3=bitxor(temp0,temp1);
msg_decoded{pac(m),1}=dec2bin(temp3,1);
Gen_array(pac(m),V)=0;
end
end
end
end
end
xx
% t1=toc;
% t1
BE=0;
fail_pac=0;
for i=1:K
for j=1:amt
if isempty(Random_dec_array{i,1})==0
if b{i,1}(1,j)~=str2double(Random_dec_array{i,1}(1,j))
BE=BE+1;
end
end
end
end
for i=1:K
for j=1:amt
if isempty(Random_dec_array{i,1})==1
Random_dec_array{i,1}=num2str(~b_t0(i,j));fail_pac=fail_pac+1;
BE=BE+amt;
end
end
end
disp('未解出包的个数');
fail_pac
BER=BE/(K*amt);
Ber_count(num)=BER;
disp('误码个数');
BE
disp('误码率');
BER
tmp0=zeros(K,amt);
for i=1:K
for j=1:amt
tmp0(i,j)=str2double(Random_dec_array{i,1}(1,j));
end
end
tmp1=tmp0';
mark2=(reshape(tmp1,co,ro))';
figure(fig)
subplot(2,4,4);
% mark2=uint8(mark2);
imshow(mark2,[ ]),title('提取水印crc6图像(DCQIM法)');
[ro7,co7]=size(I7);
if ro7==co7&&ro7==512
PSNR=psnr(I0,I7,cm,rm);
% PSNR=psnr(psnr_cover,psnr_watermarked,cm,rm);
Psnr_count(num)=PSNR;
PSNR
% Psnr_count(num)=PSNR;
% else
% continue;
end
%%%%%%% Oringinal mark and mark test %%%%%%%%%%
disp('原水印图象与提取水印图象互相关系系数')
NC=nc(mark2,wm_cpy);
Nc_count(num)=NC;
NC
end
3 仿真结果
disp('对嵌入水印的图象攻击,选择项(dt-dcqim法(6in8),加了LT码和CRC6)');
disp('1—添加高斯白噪声');
disp('2-添加椒盐、加性或斑点噪声');
disp('3--高斯低通滤波');
disp('4--均值滤波');
disp('5--中值滤波');
disp('6—直方图统计算法对图像进行增强');
disp('7—直方图规定化对图像进行增强');
disp('8—对图像进行模糊集增强');
disp('9—JPEG 压缩');
disp('10—对图像进行毛玻璃扭曲');
disp('11—尺寸缩放');
disp('12—图象剪切');
disp('13—对图像进行一定角度旋转');
disp('14—对图像进行旋转扭曲');
disp('15—对图像进行平移');
disp('16—对图像先rotation再scale(包括各种RS组合攻击)');
disp('17—对图像先scale再rotation(包括各种RST组合攻击)');
disp('18—对图像先scale再translation');
disp('19—对图像先translation再scale');
disp('20—对图像Rot和Crop的攻击,不去黑色背景');
disp('21—对图像Rot和Crop的攻击,去黑色背景,类似Stirmark中RotCrop攻击');
disp('22—对图像Rot、Sca、Crop的攻击,去黑色背景,类似Stirmark中RotScale攻击');
disp('23—对图像先Rot、再Trans的组合攻击');
disp('24—对图像先Trans、再Rot的组合攻击');
disp('25—对图像先Sca、再Rot、后Trans的组合攻击');
disp('26—对图像先Sca、再Trans、后Rot的组合攻击');
disp('27—对图像Shearing攻击');
disp('28—对图像Linear Geometric Transform/Linear Transform攻击');
disp('29—对图像随机删除几行几列');
disp('0—直接检测水印')
4 参考文献
5 代码下载