⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distortion.m

📁 图像模板匹配计算
💻 M
字号:
clc;
tic;
Ideal=imread('ideal.bmp');
Real=imread('real_d.bmp');
%figure;
%imshow(Real);           %显示实际图像
%figure;
%imshow(Ideal);            %显示理想图像

P_ideal=Ideal(1:1200,1:1600,1)*0.11+Ideal(1:1200,1:1600,2)*0.30+Ideal(1:1200,1:1600,3)*0.59;
P_real=Real(1:1200,1:1600,1)*0.11+Real(1:1200,1:1600,2)*0.30+Real(1:1200,1:1600,3)*0.59;
i=1;

while(i<=1200)
    j=1;
 while(j<=1600)
        if P_real(i,j)>200
            P_real(i,j)=255;
        else
            P_real(i,j)=0;
        end
        if P_ideal(i,j)>150
            P_ideal(i,j)=255;
        else
            P_ideal(i,j)=0;
        end
        j=j+1;
 end
    i=i+1;
end



%figure;
%imshow(P_ideal);           %显示实际图像
%figure;
%imshow(P_real);            %显示理想图像
p=0;
q=0;                       %控制点计数器
tic;
x=0;
y=0;

i=80;

while( (i>=80) & (i<1200-100))              %基于图像特征的,控制点寻找确定算法
       flag=0;
       j=30;
    while ( (j>=30) & (j<1600-60))
                        nu1=0;
                        nu2=0;
                        nu3=0;
                        nu4=0;
                       if length(find(P_ideal(i-(1:20),j)<1))>15
                           nu1=1;
                       end
                       if length(find(P_ideal(i+(1:20),j)<1))>15
                           nu2=1;
                       end
                       if length(find(P_ideal(i,j-(1:20))<1))>15
                           nu3=1;
                       end
                       if length(find(P_ideal(i,j+(1:20))<1))>15
                           nu4=1;
                       end
                       if (nu1==1 | nu2==1)&(nu3==1 | nu4==1)
                                         p=p+1;
                                         x(p)=j;
                                         y(p)=i;
                                         flag=flag+1;
                                         j=j+40;
                         else
                           j=j+1;
                       end
    end
    if flag==25
        i=i+40;
    else
        i=i+1;
    end
end
i=80;
j=30;
u(1:425)=0;
v(1:425)=0;
flag=0;
k=0;
while( (i>=80) & (i<1200-40))              %基于图像特征的,控制点寻找确定算法
     j=21;
    while ( (j>=21) & (j<1600-20))
        r_nu1=0;
        r_nu2=0;
        r_nu3=0;
        r_nu4=0;
      if length(find(P_real(i-(1:20),j)<1))>15
           r_nu1=1;
       end
       if length(find(P_real(i+(1:20),j)<1))>15
           r_nu2=1;
       end
       if length(find(P_real(i,j-(1:20))<1))>15
           r_nu3=1;
       end
       if length(find(P_real(i,j+(1:20))<1))>15
           r_nu4=1;
       end
       if (r_nu1==1 | r_nu2==1)&(r_nu3==1 | r_nu4==1)
              if length(find(u(q*25+1:(q+1)*25)))<25
                  w=uint16((j+30)/60-0.1);
                  if w>13
                      w=w-1;
                  end
                        if u(q*25+w)==0
                                u(q*25+w)=j;
                                v(q*25+w)=i;
                                flag=flag+1;
                                 if flag==25
                                  k=1;
                                 end
                              else
                                  if u(q*25+w)>j
                                      u(q*25+w)=j;
                                      v(q*25+w)=i;
                                  end
                              end
                             
                end
            if k==1
                j=1600;
            else
              j=j+40;
            end
       else
           j=j+1;
       end
    end
    if k==1
        i=i+30;
        q=q+1;
        flag=0;
        k=0;
       
    else
        i=i+1;
   end
end
%length(x)
%length(y)
%length(u)
%length(v)
%x(1:425)
%u(1:425)

%P_real=Real(1:1200,1:1600,1);
%for L=1:425
%P_real(v(L)-5:v(L)+5,u(L)-5:u(L)+5)=255;
%end
%figure;
%imshow(P_real);

pw=4;                                      %多项式次数
k=(pw+1)*pw/2;                             %系数向量的长度
T(1:k,1:k)=0;
T0(1:k,1:k)=0;
T1(1:k,1:k)=0;
X(1:k)=0;
Y(1:k)=0;
X0(1:k)=0;
Y0(1:k)=0;
delat=0;
L=1;
while L<=425
        i=1;
        j=1;
        k=1;
            while k<=pw
                p=1;
                while p<=pw-k+1
                   m=1;
                    while m<=pw
                       n=1;
                        while n<=pw-m+1
                         T0(i,j)=u(L)^(k+m-2)*v(L)^(p+n-2);
                         j=j+1;
                         n=n+1;
                         end
                         m=m+1;
                    end
                    j=1;
                    i=i+1;
                    p=p+1;
                end
               k=k+1;
            end
            j=1;
      m=1;     
     while m<=pw
         n=1;
         while n<=pw-m+1
              X0(j)=u(L)^(m-1)*v(L)^(n-1);
               j=j+1;
              n=n+1;
         end
         m=m+1;
     end  
   delat=delat+(x(L)-u(L))^2+(y(L)-v(L))^2;
    X=X+X0*x(L);
    Y=Y+X0*y(L);
    T=T+T0;
  L=L+1; 
end
%T=T/(1.0e+011)
%X=X/(1.0e+011)
%Y=Y/(1.0e+011)
delat=(1/425)*delat^(0.5)
%T1=pinv(T)
T1=inv(T);
T2=pinv(T);
if pw>=4
a=T1*X';
b=T1*Y';
else
a=T2*X';
b=T2*Y';
end
a=a';
b=b';
delat=0;
P_real=Real(1:1200,1:1600,1);
n=1;
p=1;
q=1;
 while n<=1200
    m=1;
   while m<=1600
        m1=0;
        n1=0;
        k=1;
        i=1;
        while i<=pw
        j=1;
        while j<=pw-i+1
              m1=m1+a(k)*m^(i-1)*n^(j-1);
              n1=n1+b(k)*m^(i-1)*n^(j-1);
              k=k+1;
             j=j+1;
         end
        i=i+1;
        end  
        m2=uint16(m1);
        n2=uint16(n1);
       if m2>m1
          p1=m2-m1;
          m1=uint16(m1-0.5);
       else
         p1=m1-m2;
         m1=uint16(m1);
       end
       if n2>n1
         q1=n2-n1;
         n1=uint16(n1-0.5);
       else
          q1=n1-n2;
          n1=uint16(n1);
       end
      
    %  uint8(q1);
    %  uint8(p1);
%    P_ideal_real(n1,m1)=(1-double(q1))*(double(q1)*P_real(n+1,m+1)+(1-double(q1))*P_real(n,m+1))+double(q1)*(double(q1)*P_real(n+1,m)+(1-double(q1))*P_real(n,m));
      %P_ideal_real(n1,m1)=(1-uint8(q1))*(uint8(q1)*P_real(n+1,m+1)+(1-uint8(q1))*P_real(n,m+1))+uint8(q1)*(uint8(q1)*P_real(n+1,m)+(1-uint8(q1))*P_real(n,m));
      %P_ideal_real(n1,m1)=(1-q1)*(q1*P_real(n+1,m+1)+(1-q1)*P_real(n,m+1))+q1*(q1*P_real(n+1,m)+(1-q1)*P_real(n,m));
    
  %       if m1<1
  %          m1=1;
  %      end
 %       if n1<1
 %           n1=1;
 %       end
 %       if m1>1600
 %           m1=1600;
 %       end
 %       if n1>1200
 %           n1=1200;
 %       end
        P_ideal_real(n1,m1)=P_real(n,m);
     if (u(p)==m)&(v(p)==n)
            delat=delat+(m1-x(p))^2+(n1-v(p))^2;
            p=p+1;
        end
      m=m+1;
   end
 n=n+1;
 end
delat=double(delat);
delat=(1/425)*delat^(0.5)
%figure;
%imshow(P_ideal_real);


border1_left=min(u);
border2_right=max(u);
border1_up=min(v);
border2_down=max(v);
sector=5;
i=border1_up;
i1=1;
while (i<=border2_down)
    j=border1_left;
    k=1;
    while(j<=border2_right)
      Pin(i1:i1+sector,k:k+sector)=P_ideal_real(i,j);
      j=j+1;
      k=k+sector+1;
    end
    i=i+1;
    i1=i1+sector+1;
end
size(Pin)
imwrite(Pin,'Pin.jpg','jpg');
t=toc
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -