【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC码多种算法实现图像隐藏(抗多种攻击)matlab源码

简介: 【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC码多种算法实现图像隐藏(抗多种攻击)matlab源码

1 内容介绍

网络技术和多媒体技术迅猛发展,为了更好地保障图像信息传输的安全性和可靠性,解决数字图像的版权保护问题,图像信息隐藏技术已成为图像处理领域的研究热点之一.采用MATLAB开发环境,提出了一种图像信息隐藏算法,实现了图像信息隐藏的两大基本功能,即信息的嵌入和信息的提取.同时,模拟常见的攻击方法,验证了添加隐藏信息后的图像的抗攻击能力.实验表明,该算法具有较强的鲁棒性,添加隐藏信息后的图像能有效地应对多种常见攻击,且隐藏的信息具有良好的不可见性.

2 仿真代码


I2_2=attack1(d,I0_wm,fig);

%%%去除权威0的行和列,使本文算法可以抵抗RT、RST的组合攻击

% [ro2,co2]=size(I2_2);

%     m=0;I2_21=[];    

%     for i=1:ro2

%         if sum(uint8(I2_2(i,:)))>512

%             m=m+1;

%             I2_21(m,:)=uint8(I2_2(i,:));

%         end

%     end

%     n=0;

%     for i=1:co2

%         if sum(I2_21(:,i))>512

%             n=n+1;

%             I2_22(:,n)=I2_21(:,i);

%         end

%     end

%     I2_2=I2_22;

%     figure,imshow(uint8(I2_2));title('去除行列为0后的图像')


% I1=im2double(imread('TestImages/lena.bmp'));

% rect=[20 20 460 460];

% I2_2=imcrop(uint8(I2_0),rect);

% 先scale后rotation

% Scl=614;

% I2_1=imresize(I2_0,[Scl Scl],'bilinear');    %%无论是imrotate还是imresize采用'bicubic'是最好的

% I2_2=imrotate(I2_1,10,'bilinear');

I2=im2double(uint8(I2_2));                     %先必须化为uint8型,然后用im2double归一化

% Get the Key Points

%% 受攻击后的图像与原图像(备注:此处有误,其实应该为嵌入水印的载体图像)进行第一次特征点的匹配

Options.upright=true;

Options.tresh=0.0002;

Ipts1=OpenSurf(I1,Options);

Ipts2=OpenSurf(I2,Options);

% 挑选Scale在一定范围内的点,因尺度太大或太小,受攻击后易丢失,但受攻击后的图像不需要选择

% m=0;

% for i=1:length(Ipts1)

%     if Ipts1(i).scale>=2.0&&Ipts1(i).scale<=6.0

%         m=m+1;

%         Ipts1_impv(m)=Ipts1(i);

%     end

% end

% save('fp_mult.mat','Ipts1_impv');

% fp_tst=load('fp_mult.mat');

% Ipts1_impv=fp_tst.Ipts1_impv;


point_cnt=0;ip_tmp1=[];

for i=1:length(Ipts1)

  ip=Ipts1(i);

 

  S = 2 * fix(2.5 * ip.scale);

%    R = fix(S / 2);

 

  if S>=10.0&&S<=30

      ip_tmp1=[ip_tmp1;Ipts1(i)];

      point_cnt=point_cnt+1;

%        pt =  [(ip.x), (ip.y)];

%        ptR = [(R * cos(ip.orientation)), (R * sin(ip.orientation))];

%        

%        if(ip.laplacian >0), myPen =[0 0 1]; else myPen =[1 0 0]; end

%        

%        rectangle('Curvature', [1 1],'Position', [pt(1)-R, pt(2)-R, S, S],'EdgeColor',myPen);

%        

%        plot([pt(1), pt(1)+ptR(1)]+1,[pt(2), pt(2)+ptR(2)]+1,'g');

  end

 


 

end

% orientation_max=max(ip_tmp1.orientation);

% nc_max=max(Nc_sta(:,1));

%  tmp=Nc_sta(:,1)>=0.86*nc_max;

%  nc_coord_alt=Nc_sta(tmp,:);

[a1,idx1]=sort(abs([ip_tmp1.doh]),'descend');

ip_sort=ip_tmp1(idx1);



nn=0;ip_fp=ip_sort(1);

for i=2:length(ip_sort)

      if nn>=17

          break;

      end

      S_sort = 2 * fix(2.5 * ip_sort(i).scale);

      R_sort = fix(S_sort/2);

%        mm=0;

      kk=0;

      for j=1:length(ip_fp)

           S_fp = 2 * fix(2.5 * ip_fp(j).scale);

           R_fp = fix(S_fp/2);

%             mm=mm+1;

           if sqrt((ip_fp(j).x-ip_sort(i).x)^2+(ip_fp(j).y-ip_sort(i).y)^2)>=R_sort+R_fp

               kk=kk+1;

             

           end

           

      end

      if kk==length(ip_fp)

         nn=nn+1;

         ip_fp=[ip_fp;ip_sort(i)];

      end

end

save('fp_invT_480_lna1.mat','ip_fp');

figure,imshow(I1,[]);hold on;

for i=1:length(ip_fp)

   ip=ip_fp(i);

   

   S = 2 * fix(2.5 * ip.scale);

   R = fix(S / 2);

   

   %         if S>=12&&S<=30

   %             ip_tmp1=[ip_tmp1;ipts(i)];

   %             point_cnt=point_cnt+1;

   pt =  [(ip.x), (ip.y)];

   ptR = [(R * cos(ip.orientation)), (R * sin(ip.orientation))];

   

   if(ip.laplacian >0), myPen =[0 0 1]; else myPen =[1 0 0]; end

   

   rectangle('Curvature', [1 1],'Position', [pt(1)-R, pt(2)-R, S, S],'EdgeColor',myPen);

   

   plot([pt(1), pt(1)+ptR(1)]+1,[pt(2), pt(2)+ptR(2)]+1,'g');

   

end


fp1=load('fp_invT_480_lna1.mat');

Ipts1_impv=fp1.ip_fp;

% Ipts2_impv=[];

n=0;

for i=1:length(Ipts2)

   if Ipts2(i).scale>=2.0&&Ipts2(i).scale<=6.5

       n=n+1;

       Ipts2_impv(n)=Ipts2(i);

   end

end

% Ipts2_impv=Ipts2;

% Put the landmark descriptors in a matrix

D1 = reshape([Ipts1_impv.descriptor],64,[]);

D2 = reshape([Ipts2_impv.descriptor],64,[]);


% Find the best

% matches,最近邻次近邻比值的阈值设定法挑选,Ransac算法再进行一次挑选,是否要用到最小二乘法拟合那个矩阵???

err=zeros(1,length(Ipts1_impv));

% cor1=1:length(Ipts1_impv);

cor2=zeros(1,length(Ipts1_impv));

ratio=zeros(length(Ipts1_impv),1);

dis_store=zeros(length(Ipts1_impv),2);

dis_ratio=zeros(length(Ipts1_impv),5);

for i=1:length(Ipts1_impv)

   distance=sum((D2-repmat(D1(:,i),[1 length(Ipts2_impv)])).^2,1);

   dis_sort=sort(distance,'ascend');

   dis_store(i,:)=[dis_sort(1),dis_sort(2),];

   ratio(i)=dis_sort(1)/dis_sort(2);        

   [err(i),cor2(i)]=min(distance);

   dis_ratio(i,:)=[dis_store(i,:) ratio(i) i cor2(i)];

end


dis_ratio1=sortrows(dis_ratio,3);

mask1=dis_ratio1(:,3)<=0.9;

dis_ratio2=zeros(sum(mask1),5);

nn=0;

for i=1:length(dis_ratio1)

   if mask1(i)

       nn=nn+1;

       dis_ratio2(nn,:)=dis_ratio1(i,:);

   end

end


% 利用Ransac算法对匹配的点再进行一次挑选


max_itera=50;          %设置最大迭代次数

sigma=1.8;        %设置拟合矩阵[m11,m12,m13;m21,m22,m23;0,0,1]还原的偏差

pretotal=0;     %符合拟合模型的数据的个数

k=0;

% sample=round(18*rand(50,3));

% save('Index.mat','sample');

sam_tmp=load('Index.mat');

Samp=sam_tmp.sample;

while pretotal <= size(dis_ratio2,1)*0.75 &&  k<max_itera      %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了

   SampIndex=Samp(k+1,:);

%     SampIndex=round(1+(size(dis_ratio2,1)-1)*rand(3,1));  %产生三个随机索引,找样本用,floor向下取整

   

   samp1_tmp=dis_ratio2(SampIndex,4);     %对原数据随机抽样两个样本

   samp2_tmp=dis_ratio2(SampIndex,5);

   

   samp1=[Ipts1_impv(samp1_tmp).y;Ipts1_impv(samp1_tmp).x];    % 此处特别注意,其实在利用SURF算法时,其中有一步

   samp2=[Ipts2_impv(samp2_tmp).y;Ipts2_impv(samp2_tmp).x];    % 通过旋转Haar小波模板求响应值,将X,Y的坐标对调了

   

   att_matr=Matrix_solv(samp1,samp2);      %对两组数据拟合出矩阵,或其他变种拟合方法

   total=0;dis_ratio3=[];

   for j=1:size(dis_ratio2,1)

       x_ini=Ipts1_impv(dis_ratio2(j,4)).y;y_ini=Ipts1_impv(dis_ratio2(j,4)).x;

       x_atk=Ipts2_impv(dis_ratio2(j,5)).y;y_atk=Ipts2_impv(dis_ratio2(j,5)).x;

       tmp=att_matr*[x_atk;y_atk;1];

       x_red=tmp(1);y_red=tmp(2);

      if sqrt((x_ini-x_red)^2+(y_ini-y_red)^2)<sigma

          total=total+1;

          dis_ratio3=[dis_ratio3;dis_ratio2(j,:)];

      end

   end

%     mask=abs(line*[data ones(size(data,1),1)]');    %求每个数据到拟合直线的距离

%     total=sum(mask<sigma);              %计算数据距离直线小于一定阈值的数据的个数

   

   if total>pretotal              %找到符合拟合矩阵数据最多的拟合矩阵

       pretotal=total;

       bestmatr=att_matr;          %找到最好的拟合矩阵

       best_disratio=dis_ratio3;   %找到最符合条件的那些坐标

       best_matr_r=att_matr;

   end  

   k=k+1;

end

best_matr_r1=inv(best_matr_r);


   

% Sort matches on vector distance

% [err, ind]=sort(err);

cor1_1=best_disratio(:,4);

cor2_1=best_disratio(:,5);


%% 法1 用左除命令(m=A\b)来寻求矩阵m的最小二乘解

% coord_ini_matr=[];coord_x_att=[];

% for i=1:length(best_disratio)

%     tmp=

%     coord_ini_matr=[coord_ini_matr;]

% tmp=ones(length(best_disratio),1);

tmp=ones(size(best_disratio,1),1);

coord_ini_matr=[[Ipts1_impv(cor1_1).y]',[Ipts1_impv(cor1_1).x]',tmp];

coord_x_att=[Ipts2_impv(cor2_1).y]';

att_matr_13=coord_ini_matr\coord_x_att;

coord_y_att=[Ipts2_impv(cor2_1).x]';

att_matr_46=coord_ini_matr\coord_y_att;

att_matr_ls=[att_matr_13';att_matr_46';0,0,1];

% T_m{num,1}=att_matr_ls;


%%% 真实的放射攻击矩阵



%%%% 法2:先用已知X坐标拟合m11,m12,m13,再用已知Y坐标拟合m21,m22,m23,并和法1的结果相比较,验证矩阵左除是否是LS解

% att_matr_13_1=lsqnonneg(coord_ini_matr,coord_x_att);

% att_matr_46_1=lsqnonneg(coord_ini_matr,coord_y_att);

% att_matr_ls1=[att_matr_13_1';att_matr_46_1';0,0,1];   %%这不是最小二乘法吧???和att_matr_ls差别非常大



% Make vectors with the coordinates of the best matches

Pos1=[[Ipts1_impv(cor1_1).y]',[Ipts1_impv(cor1_1).x]'];

Pos2=[[Ipts2_impv(cor2_1).y]',[Ipts2_impv(cor2_1).x]'];

% Pos1=Pos1(1:15,:);

% Pos2=Pos2(1:15,:);


% Show both images

% I = zeros([size(I1,1) size(I1,2)*2 size(I1,3)]);

% I(:,1:size(I1,2),:)=I1; I(:,size(I1,2)+1:size(I1,2)+size(I2,2),:)=I2;

% figure, imshow(I); hold on;

%%gray image

I = zeros([round(1.6*size(I1,1)) round(size(I1,2)*2.6) ]);

I(1:size(I1,1),1:size(I1,2))=I1; I(1:size(I2,1),size(I1,2)+1:size(I1,2)+size(I2,2))=I2;

figure, imshow(I,[]); hold on;


% Show the best matches

plot([Pos1(:,2) Pos2(:,2)+size(I1,2)]',[Pos1(:,1) Pos2(:,1)]','-');

plot([Pos1(:,2) Pos2(:,2)+size(I1,2)]',[Pos1(:,1) Pos2(:,1)]','o');


%% 等比例缩放与旋转、不等比例缩放与旋转、仅有不等比例缩放的判定,若为不等比例缩放与旋转的攻击,则判定先R还是先S

m11=att_matr_ls(1,1);m12=att_matr_ls(1,2);

m21=att_matr_ls(2,1);m22=att_matr_ls(2,2);

% Sca_flag_un=0;   %%不等比例缩放标志,对于先R在不等比例S,必须先还原S,然后再还原角度

% Sca_flag=0;

% RS_dist_condi1=abs(abs(m12/m11)-abs(m21/m22));  %% 到底是先不等比S还先R的区别条件

% % RS_dist_condi2=abs(abs(m11/m22)-abs(m21/m12));  %% 备注:此处在多想一下,有没有更精准的判定准则???

% % RS_dist_condi2 判定条件没多大意义,不等比例S、R的组合攻击都是如此

% if abs(m11-m22)>=0.05        %% 存在不等比例缩放或不等比例缩放与旋转的攻击

%     if RS_dist_condi1<=0.015 %% 判定为先R再S(不等比)Plane这幅图比较特殊,这个值需大一些

% %         [Sx,theta1]=solve('Sx*cosd(theta1)=m11','-Sx*sind(theta1)=m12','Sx','theta1');

% %         [Sy,theta2]=solve('Sy*sind(theta2)=m21','Sy*sind(theta2)=m22','Sy','theta2');

%         theta1=atand(-m12/m11); theta2=atand(m21/m22);

%         Sx_nu=sqrt(m11^2+m12^2);Sy_nu=sqrt(m21^2+m22^2);

%         Sx_nu

%         Sy_nu

%         theta=(theta1+theta2)/2;

%         theta

%         if abs(theta)<0.25

%             disp('仅存在不等比例缩放');

%             Sx_nu=m11;Sy_nu=m22;

%             Sx_nu

%             Sy_nu

%             Rot_flag=0;

%             Sca_flag=1;   %%此处还是用Sca_flag吧,为了和水印判断那段程序统一

%             [ro2,co2]=size(I2);

%             x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu);

%             I4=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic');  %%将不等比例缩放还原

%             Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;

%            

%            

%         else

%             disp('存在不等比例缩放与旋转的攻击(先R再S)');

%             [ro2,co2]=size(I2);

%             x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu);  %%对于先R再S的不等比例攻击必须先还原S,若先还原角度则会造成类似于Shearing的攻击

%             I2=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic');  %%备注:论文中如何描述、阐明???

%             Sca_flag=1;                               %%此处还是先用Sca_flag吧,为了和水印判断那段程序统一

%             I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');

%             I3=im2double(I3_tmp);

%             figure,imshow(I3,[]),title('旋转theta角度后校正的图像');

%             Rot_flag=1;                                       %imrotate攻击标志

%             I4=im2uint8(I3);

%             Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;

%             thet_rv1(num,1)=theta;

%         end

%     else     %% 判定为先S再R(不等比)

% %         [Sx,theta1]=solve('Sx*cosd(theta1)=m11','Sx*sind(theta1)=m21','Sx','theta1');

% %         [Sy,theta2]=solve('-Sy*sind(theta2)=m12','Sy*cosd(theta2)=m22','Sy','theta2');

%         theta1=atand(m21/m11); theta2=atand(-m12/m22);

%         Sx_nu=sqrt(m11^2+m21^2);Sy_nu=sqrt(m12^2+m22^2);

%         Sx_nu

%         Sy_nu

%         theta=(theta1+theta2)/2;

%         theta

%         if abs(theta)<0.25

%             disp('仅存在不等比例缩放');

%             Sx_nu=m11;Sy_nu=m22;

%             Sx_nu

%             Sy_nu

%             Rot_flag=0;

%             Sca_flag=1;   %%此处还是用Sca_flag吧,为了和水印判断那段程序统一

%             [ro2,co2]=size(I2);

%             x_s_rev=round(ro2/Sx_nu);y_s_rev=round(co2/Sy_nu);

%             I4=imresize(im2uint8(I2),[x_s_rev y_s_rev],'bicubic');  %%将不等比例缩放还原

%             Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;

%         else

%             disp('存在不等比例缩放与旋转的攻击(先S再R)')

%             I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');

%             I3=im2double(I3_tmp);

%             figure,imshow(I3,[]),title('旋转theta角度后校正的图像'); %%%先还原角度

%             Rot_flag=1;                                       %imrotate攻击标志

%             [ro3,co3]=size(I3);

%             x_s_rev=round(ro3/Sx_nu);y_s_rev=round(co3/Sy_nu);

%             I3=imresize(im2uint8(I3),[x_s_rev y_s_rev],'bicubic');   %%%再还原缩放尺度

%             I4=I3;

%             Sca_flag=1;     %%此处还是先用Sca_flag吧,为了和水印判断那段程序统一            

%             Sx_rv1(num,1)=Sx_nu; Sy_rv1(num,1)=Sy_nu;

%             thet_rv1(num,1)=theta;

%         end

%     end

% else  %%等比例缩放或旋转或等比例缩放与旋转攻击同时有

%    

%    

%     theta1=atand(-m12/m11); theta2=atand(m21/m22);theta3=atand(m21/m11);theta4=atand(-m12/m22);

%     theta=(theta1+theta2+theta3+theta4)/4;

%     theta

%

%     S_un1=sqrt(m11^2+m12^2);S_un2=sqrt(m21^2+m22^2);S_un3=sqrt(m11^2+m21^2);S_un4=sqrt(m12^2+m22^2);

%     S_un=(S_un1+S_un2+S_un3+S_un4)/4;

%     S_un

%

%     if abs(theta)<=0.25

% %         figure,imshow(I2,[]);title('没受到旋转攻击的图片');

%         I3=I2;

%         Rot_flag=0;  

%     else

%         I3_tmp=imrotate(im2uint8(I2),-theta,'bicubic','crop');

%         I3=im2double(I3_tmp);

%         figure,imshow(I3,[]),title('旋转theta角度后校正的图像');

%         Rot_flag=1;                                       %imrotate攻击标志

%         thet_rv1(num,1)=theta;

%     end

%     %%判定有无等比例缩放攻击,若有则进行相应的还原

%     if abs(S_un-1.0)<=0.015

%     figure,imshow(I3);title('没受到等比例缩放攻击的图片');

%     I4=im2uint8(I3);

% %     Sca_flag=0;  

%     else    

%     [ro3,co3]=size(I3);

%     x_s_rev=round(ro3/S_un);y_s_rev=round(co3/S_un);

%     I4=imresize(im2uint8(I3),[x_s_rev y_s_rev],'bicubic');

%     figure,imshow(uint8(I4),[ ]),title('缩放或旋转缩放攻击校正后的图像');

%     Sca_flag=1;             %受到缩放攻击的标志

%     Sca_flag_un=1;

%     S_un_rv1(num,1)=S_un;

%    end

%    

% end


%% 求出仿射矩阵T,利用求逆来还原图像

att_matr_ls1=[m22,m12,0;m21,m11,0;0,0,1];

T_m{num,1}=att_matr_ls1;

T_inv=inv(att_matr_ls1);

transa1=maketform('affine',T_inv);

I4=imtransform(im2uint8(I2),transa1);%WIa为遭遇RST几何攻击后的图像

figure;imshow(uint8(I4),[]);

[ro4,co4]=size(I4);

%     I4=im2uint8(I4);

   m=0;I4_1=[];    

   for i=1:ro4

       if sum(uint8(I4(i,:)))>512*40

           m=m+1;

           I4_1(m,:)=I4(i,:);

       end

   end

   n=0;

   for i=1:co4

       if sum(I4_1(:,i))>512*40

           n=n+1;

           I4_2(:,n)=I4_1(:,i);

       end

   end

   I4=I4_2;

   

   

%% 首先在空域寻找嵌入特殊信息的位置块,以便定位到边缘被破坏的图片的边界以及再一次精准校正


   Nc_total4=[];nc_coord_tal4=[];coord_avg4=[];

   coordx=25;coordy=25;

   [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I4,coordx,coordy,flg_grp(1,:));

   Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];

   coordx=25;coordy=463;

   [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena12(I4,coordx,coordy,flg_grp(2,:));

   Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];

%     coordx=247;coordy=247;

%     [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66(I5,coordx,coordy,flg_grp(3,:));

%     Nc_total=[Nc_total;Nc_sta];nc_coord_tal=[nc_coord_tal;nc_coord_alt];coord_avg=[coord_avg;coord_x_y];

   coordx=463;coordy=25;

   [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_lena21(I4,coordx,coordy,flg_grp(4,:));

   Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];

   coordx=463;coordy=463;

   [Nc_sta,nc_coord_alt,coord_x_y]=odd_even_ext24_66_1(I4,coordx,coordy,flg_grp(5,:));

   Nc_total4=[Nc_total4;Nc_sta];nc_coord_tal4=[nc_coord_tal4;nc_coord_alt];coord_avg4=[coord_avg4;coord_x_y];

   

   %%利用特殊位置的点相对距离求出像素的偏差,并且再一次精准校正

   x1x4_dis=coord_avg4(3,1)-coord_avg4(1,1);

   x2x5_dis=coord_avg4(4,1)-coord_avg4(2,1);

   x_devi=(438-(x1x4_dis+x2x5_dis)*0.5)/(438/512);   %若x_devi为正则需要放大,为负则需要缩小

   y1y4_dis=coord_avg4(2,2)-coord_avg4(1,2);

   y2y5_dis=coord_avg4(4,2)-coord_avg4(3,2);

   y_devi=(438-(y1y4_dis+y2y5_dis)*0.5)/(438/512);         %若y_devi为正则需要放大,为负则需要缩小

   [ro4,co4]=size(I4);

   if abs(x_devi)>=2.0&&abs(y_devi)>=2.0

       ro5=round(x_devi)+ro4;co5=round(y_devi)+co4;

       I5=imresize(I4,[ro5 co5],'bicubic');

       Scl_fc(count,1)=1;

   elseif abs(x_devi)>=2.0&&abs(y_devi)<2.0

3 运行结果

4 参考文献

[1]尤鸿霞, 郭江峰. 基于Matlab的二值图象数据隐藏算法的实现[J]. 南通纺织职业技术学院学报, 2008.

[2]庞镇明. 基于MATLAB小波变换在图像处理中算法的实现[D]. 北京理工大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。


相关文章
|
2月前
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。
|
3月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
5月前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
117 80
|
1天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
23天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
29天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
9天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
17天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
25天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
108 15

热门文章

最新文章