【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC(循环冗余检验)码多种算法实现图像隐藏(抗多种攻击)matlab源码
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:
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 end3 仿真結果
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源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc mfc Edit SetFocus
- 下一篇: 语法学习