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,

  1. 先列采样,得到两幅图,一幅保留偶数列,一幅保留奇数列,行不变;

  2. 然后两幅图像做差分,结果保留在其中一幅A,则A为高频(H),另一幅B只参与运算,不改变结果,作为低频(L);

  3. 对图A,做行采样,得奇偶,差分得高频图像(HH)和低频图像(HL)。

  4. 对图B,做行采样,差分得高频图像(LH)和低频图像(LL),完成一遍变换;

  5. 对低频(LL)作为一幅新的图像,重复上面的变换。


PS:

  1. 其中LL得到的过程中只是只参与的运算,未改变过自身,即LL只是原图的一个采样图,如下图3左上角所示。
  2. 通过采样进行多尺度多分辨率处理,提取的是特征点。如一个三角形,它的角是弯的,直接检测不会被认为是角点,但采样过后,这个弯的角点可能就变成尖的,就会被采集到。(多尺度的作用参考SIFT算法)
  3. 用奇偶行(或列)进行差分得到高频特征,是由Haar小波基的定义而来(一上一下,采样后相当于小波基宽度加大,而其他小波基则对应卷积得到高频,不处理为低频?)。对于其他的小波基则不一定一样。
  4. 与傅立叶变换不同,小波变换能提取高频分量及其对应的位置信息。

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<countnum=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:K1m=1;for j=1:amtb{n,1}(1,m)=b_t0(i,j);m=m+1;endn=n+1;
end
b_uncode=cell(K1,1);
for i=1:K1for j=1:amtb_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:Mpos=find(Gen_array1(i,:)==1);x{1,1}=pos; % 元胞的第1个元存放参与混合的包的序号x{1,2}='0' ; % 元胞的第2个元存放混合后的信息for j=postemp0=bin2dec(x{1,2});temp1=bin2dec(b_uncode{j,1});temp2=bitxor(temp0,temp1);x{1,2}=dec2bin(temp2,amt);endmsg_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:6crc4_ini0{mm,1}(1,l)=msg_coded{6*(i-1)+j,2};l=l+1;endmm=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:Mtemp0=bin2dec(crc4_ini0{i,1});temp1=de2bi(temp0,6,'left-msb');                      %注意:此处只能用de2bimsg=reshape(temp1',6, 1);crc4_ini{i,1}=generate(h,msg)';
end
%%检测crc6的算法正确性
crc4_tmp=cell(M,1);
for i=1:Mfor 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*8DCTI0=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:lenrnd1(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:Mn=1;k=1;while k<=length(crc4_ini{1,1})/im_lk=k+1;for j=1:im_lcrc_tran{m,1}(1,j)=crc4_ini{i,1}(1,n);n=n+1;endm=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/8if m>lenbreak;endfor p=1:cm2/8if m>lenbreak;endx=(s-1)*8;y=(p-1)*8;l=1;for n=1:im_lk=rnd1(m,n); if k==1var=abs(cda0(x+1,y+2)/Q50(1,2));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+1,y+2)=(1-gamma1)*sign(cda0(x+1,y+2))*Q50(1,2)*var1+gamma1*cda0(x+1,y+2);endif k==2var=abs(cda0(x+2,y+1)/Q50(2,1));if   crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif  crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+2,y+1)=(1-gamma1)*sign(cda0(x+2,y+1))*Q50(2,1)*var1+gamma1*cda0(x+2,y+1);endif k==3var=abs(cda0(x+3,y+1)/Q50(3,1));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+3,y+1)=(1-gamma1)*sign(cda0(x+3,y+1))*Q50(3,1)*var1+gamma1*cda0(x+3,y+1);endif k==4var=abs(cda0(x+2,y+2)/Q50(2,2));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+2,y+2)=(1-gamma1)*sign(cda0(x+2,y+2))*Q50(2,2)*var1+gamma1*cda0(x+2,y+2);endif k==5var=abs(cda0(x+1,y+3)/Q50(1,3));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+1,y+3)=(1-gamma1)*sign(cda0(x+1,y+3))*Q50(1,3)*var1+gamma1*cda0(x+1,y+3);endif k==6var=abs(cda0(x+1,y+4)/Q50(1,4));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+1,y+4)=(1-gamma1)*sign(cda0(x+1,y+4))*Q50(1,4)*var1+gamma1*cda0(x+1,y+4);endif k==7var=abs(cda0(x+2,y+3)/Q50(2,3));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+2,y+3)=(1-gamma1)*sign(cda0(x+2,y+3))*Q50(2,3)*var1+gamma1*cda0(x+2,y+3);endif k==8var=abs(cda0(x+3,y+2)/Q50(3,2));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+3,y+2)=(1-gamma1)*sign(cda0(x+3,y+2))*Q50(3,2)*var1+gamma1*cda0(x+3,y+2);endif k==9var=abs(cda0(x+4,y+1)/Q50(4,1));if  crc_tran{m,1}(1,l)==0var1=2*floor(var/2+0.5);elseif crc_tran{m,1}(1,l)==1var1=2*floor(var/2)+1;endcda1(x+4,y+1)=(1-gamma1)*sign(cda0(x+4,y+1))*Q50(4,1)*var1+gamma1*cda0(x+4,y+1);endl=l+1;endm=m+1;endend
%         rr=rr+1;
%%% 将8*8DCT块进行IDCT,并将一个64*64的DWT-DCT变换块进行IDWTca1_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<=30ip_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');endend
% 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>=17break;endS_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_fpkk=kk+1;endendif 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]; endrectangle('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');endfp1=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.5n=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)];
enddis_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)<sigmatotal=total+1;dis_ratio3=[dis_ratio3;dis_ratio2(j,:)];endend
%     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:ro4if sum(uint8(I4(i,:)))>512*40m=m+1;I4_1(m,:)=I4(i,:);endendn=0;for i=1:co4if sum(I4_1(:,i))>512*40n=n+1;I4_2(:,n)=I4_1(:,i);endendI4=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.0ro5=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.0ro5=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.0ro5=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.0I5=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/8if m>lenbreak;endfor p=1:cm2/8if m>lenbreak;endx=(s-1)*8;y=(p-1)*8; l=1;for n=1:im_lk=rnd1(m,n);if k==1d=round(cda0_I6(x+1,y+2)/Q50(1,2));elseif k==2d=round(cda0_I6(x+2,y+1)/Q50(2,1));elseif k==3d=round(cda0_I6(x+3,y+1)/Q50(3,1));elseif k==4d=round(cda0_I6(x+2,y+2)/Q50(2,2));elseif k==5d=round(cda0_I6(x+1,y+3)/Q50(1,3));elseif k==6d=round(cda0_I6(x+1,y+4)/Q50(1,4));elseif k==7d=round(cda0_I6(x+2,y+3)/Q50(2,3));elseif k==8d=round(cda0_I6(x+3,y+2)/Q50(3,2));elseif k==9d=round(cda0_I6(x+4,y+1)/Q50(4,1));end%             d1(i,j,n)=d;if mod(d,2)==0crc_tran0{m,1}(1,l)='0';elsecrc_tran0{m,1}(1,l)='1';endl=l+1;endm=m+1;endend
%         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_1m=1;for j=1:chk_1for k=1:6crc4_att{i,1}(1,m)=temp{i,j}(1,k);m=m+1;endend
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:Mtemp0=bin2dec(crc4_att{i,1});temp1=de2bi(temp0,12,'left-msb');                      %注意:此处只能用de2bi[outdata error] = detect(det,temp1');error1(i,1)=error;if temp0==0error1(i,1)=1;end
end
%%检测crc6算法的正确性
error2=ones(M,1);
for i=1:Mif crc4_tmp{i,1}==crc4_att{i,1};error2(i)=0;end
end
err=zeros(M,1);
for i=1:Mif 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:cc1cc2{i,1}=crc4_att{cc(i),1};
end
ll=length(error1)-sum(error1);
j=1;
msg_decoded0=cell(ll,1);
for i=1:Mif 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:llfor j=1:length(crc4_att{1,1})-6msg_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:Mif error1(i,1)==0Gen_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<=60xx=xx+1;if sum(sum(Gen_array))==0break;endfor i=1:ll*6aa=find(Gen_array(i,:)==1);if isempty(aa)==1continue;elseV=aa(1);kk=length(aa);if kk==1Random_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;endendendend
end
xx
% t1=toc;
% t1
BE=0;
fail_pac=0;
for i=1:Kfor j=1:amt        if isempty(Random_dec_array{i,1})==0if b{i,1}(1,j)~=str2double(Random_dec_array{i,1}(1,j))BE=BE+1;endendend
end
for i=1:Kfor j=1:amtif  isempty(Random_dec_array{i,1})==1Random_dec_array{i,1}=num2str(~b_t0(i,j));fail_pac=fail_pac+1;BE=BE+amt;        endend
end
disp('未解出包的个数');
fail_pac
BER=BE/(K*amt);
Ber_count(num)=BER;
disp('误码个数');
BE
disp('误码率');
BER
tmp0=zeros(K,amt);
for i=1:Kfor j=1:amttmp0(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==512PSNR=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 代码下载

【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC(循环冗余检验)码多种算法实现图像隐藏(抗多种攻击)matlab源码相关推荐

  1. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1363期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab RRT算法无人机三维 ...

  2. 【单目标优化求解】基于matlab黑猩猩算法求解单目标问题【含Matlab源码 1413期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[单目标优化求解]基于matlab黑猩猩算法求解单目标问题[含Matlab源码 1413期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  3. 【APF三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab人工势场算法无人机三维 ...

  4. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 155期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab RRT算法无人机三维 ...

  5. 【物流选址】基于matlab免疫算法求解物流选址问题【含Matlab源码 020期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物流选址]基于matlab免疫算法求解物流选址问题[含Matlab源码 020期] 获取代码方式2: 付费专栏Matlab路径规划(初级版 ...

  6. 【A_star三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[三维路径规划]基于matlab A_star算法无人机三维路径规划[含Matlab源码 446期] 获取代码方式2: 付费专栏Matla ...

  7. 【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[SVM分类]基于matlab哈里斯鹰算法优化支持向量机SVM分类[含Matlab源码 2243期] 获取代码方式2: 付费专栏Matla ...

  8. 【ACO TSP】基于matlab蚁群算法求解31城市旅行商问题【含Matlab源码 1147期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab蚁群算法求解31城市旅行商问题[含Matlab源码 1147期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  9. 【语音隐写】基小波变换算法求解水印嵌入提取【含Matlab源码 513期】

    ⛄一.简介 随着计算机和网络的飞速发展,人们的许多创作和成果都以数字形式进行存储和发布.然而,数字作品极易被非法拷贝.伪造和窜改,使得很多版权所有者不愿意利用网络公开其作品,从而阻碍其自身发展.目前, ...

  10. 【图像去噪】基于matlab全变分算法(TV)图像去噪【含Matlab源码 625期】

    ⛄一.图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程.噪声分类有三种:加性噪声,乘性噪声和量化噪声.我们用f(x,y)表示图 ...

最新文章

  1. 赠书 | 新手指南——如何通过HuggingFace Transformer整合表格数据
  2. 语言转4字节数据整型_R语言与RGui平台_数据类型_向量_4
  3. 有赞11·11:全链路压测方案设计与实施详解
  4. Android编译笔记二
  5. 《C陷阱与缺陷》和《C专家编程》两本书又翻印了
  6. javascript --- DOM0级、DOM2级、跨浏览器 的事件处理程序
  7. Java Web 请求转发与请求重定向
  8. 本土链雷达网_走向本土设计
  9. Opencv_printf
  10. ribbon 配置 动态更新_Netflix开源工具:在SpringBoot实现动态路由
  11. Fluent Ribbon 第八步 其他控件
  12. Android 9.0 HIDL接口添加
  13. 基于OSSIM平台下华为交换机日志收集插件的开发
  14. 中间件——activityMQ
  15. 计算机高特效吃鸡游戏主机配置单,畅玩主流游戏吃鸡LOL组装电脑配置清单
  16. html表格收起展开,vue-table-element表格的全部展开和全部折叠
  17. 四川大学计算机在线作业,四川大学计算机操作系统试题
  18. 记者求证北京将禁止外地车和外地人员从事网约车传闻
  19. 苹果和小虫编程c语言,【OJ题库C/C++】Day12-苹果和虫子2
  20. 洛谷P1080 [NOIP2012 提高组] 国王游戏

热门文章

  1. deepin 网速(WIFI)太慢的一种解决方法
  2. 2020年秋招回顾总结(2021届),目前已在上海入职工作,感恩亲人与朋友,未来,你好!
  3. 《Android 软件安全与逆向分析》---- 学习笔记
  4. 案例:京东登录页面css创建
  5. PC 版微信多开防撤回软件
  6. tif转成bmp matlab,【转 】将图像转化成avi格式电影(bmp2avi,jpg2avi,tiff2avi等) - [Matlab]...
  7. Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
  8. ol-ext transform 对象,旋转、拉伸、放大(等比例缩放),事件监听
  9. 海阔凭鱼跃,天高任鸟飞
  10. ★★ 2009世界著名电子商务B2B/B2C网站大全