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

📄 bi_momentnormoneword.m

📁 该算法是bimoment非线性归一化的改进
💻 M
字号:
function imAfterMomentNorm = Bi_MomentNormOneWord(ImageName)
ImForNorm = imread(ImageName);
[xHeight,yWidth] = size(ImForNorm);
% imshow(ImForNorm);
%求字的范围
% pixelnum_x = find (sum(ImForNorm)<size(ImForNorm,1));  
% pixelnum_y = find (sum(ImForNorm')<size(ImForNorm,2));
% wLeft = pixelnum_x(1);
% wRight = pixelnum_x(size(pixelnum_x,2));
% hUp = pixelnum_y(1);
% hDown = pixelnum_y(size(pixelnum_y,2));
%  ImForNorm1 (:,:) = ImForNorm(hUp:hDown,wLeft:wRight);
%求质心\二阶矩
dx = size(ImForNorm,1)-sum(ImForNorm);
dy = size(ImForNorm,2)-sum(ImForNorm,2);
sum_im = sum(dx);
sum_Gx = 0;
sum_Gy = 0;
Moment_xSub = 0;
Moment_xPlus = 0;
Moment_ySub = 0;
Moment_yPlus = 0;
for y = 1:size(ImForNorm,1);
     for x = 1:size(ImForNorm,2);
         sum_Gy = sum_Gy+y*(1-ImForNorm(y,x));
         sum_Gx = sum_Gx+x*(1-ImForNorm(y,x));  
     end
end
%  for y = 1:size(ImForNorm1,1);
%      for x = 1:size(ImForNorm1,2);
%          sum_Gy = sum_Gy+y*(1-ImForNorm1(y,x));
%          sum_Gx = sum_Gx+x*(1-ImForNorm1(y,x));
%      end
%  end
Xc = sum_Gx/sum_im;
Yc = sum_Gy/sum_im;
for x = 1:size(ImForNorm,2);
     if (x < Xc)
          Moment_xSub =  Moment_xSub + ((x-round(Xc)).^2)*dx(x)/sum_im;
     else    
          Moment_xPlus = Moment_xPlus + ((x-round(Xc)).^2)*dx(x)/sum_im;
     end
end


 for y = 1:size(ImForNorm,1);
      if (y < Yc)
          Moment_ySub =  Moment_ySub + ((y - round(Yc)).^2)*dy(y)/sum_im;
     else    
          Moment_yPlus = Moment_yPlus + ((y - round(Yc)).^2)*dy(y)/sum_im;
     end
 end
 
%  Moment_x =  Moment_x/sum_im;
%  Moment_y = Moment_y/sum_im;
% for Beta = 2:0.1:4
%     delta_xSub = round(Beta*sqrt(Moment_xSub));
%     delta_xPlus = round(Beta*sqrt(Moment_xPlus));
%     delta_ySub = round(Beta*sqrt(Moment_ySub));
%     delta_yPlus = round(Beta*sqrt(Moment_yPlus));
%     LeftAfterNorm = round(Xc-delta_xSub);
%     RightAfterNorm = round(Xc+delta_xPlus);
%     UpAfterNorm = round(Yc-delta_ySub);
%     DownAfterNorm = round(Yc+delta_yPlus);
%     if (( LeftAfterNorm <= wLeft )&&( RightAfterNorm >=  wRight)&&(UpAfterNorm <= hUp)&&(DownAfterNorm >=hDown));
%         break;
%     end 
% end
%最优的theta是2.68-2.72
delta_xSub = 2.7*sqrt(Moment_xSub);
delta_xPlus = 2.7*sqrt(Moment_xPlus);
delta_ySub = 2.7*sqrt(Moment_ySub);
delta_yPlus = 2.7*sqrt(Moment_yPlus);
LeftAfterNorm = floor(Xc-delta_xSub);
RightAfterNorm = ceil(Xc+delta_xPlus);
UpAfterNorm = floor(Yc-delta_ySub);
DownAfterNorm = ceil(Yc+delta_yPlus);
if (LeftAfterNorm <= 0)
    LeftAfterNorm = 1;
end
if (RightAfterNorm > yWidth)
    RightAfterNorm = yWidth;
end
if (UpAfterNorm<=0)
    UpAfterNorm = 1;
end
if (DownAfterNorm>xHeight)
    DownAfterNorm = xHeight;
end
ImForNorm2(:,:) = ImForNorm(UpAfterNorm:DownAfterNorm,LeftAfterNorm:RightAfterNorm);
%   imshow(ImForNorm2);
%求解a,b,c
[a1,b1,c1] = fpoly([LeftAfterNorm round(Xc) RightAfterNorm],[0,0.5,1]);
[a2,b2,c2] = fpoly([UpAfterNorm round(Yc) DownAfterNorm],[0,0.5,1]);
fx = [];fy = [];
H1=DownAfterNorm-UpAfterNorm;
W1=RightAfterNorm-LeftAfterNorm;
if H1>W1
R1=W1/H1;
R2=sqrt(sin(pi/2*R1));
for x = LeftAfterNorm:RightAfterNorm;    
    fx = [fx round(64*R2*( a1 * x.^2 + b1 * x + c1 ))];
end
for y = UpAfterNorm:DownAfterNorm;
    fy = [fy round(64*( a2 * y.^2 + b2 * y + c2))];
end
else
R1=H1/W1;
R2=sqrt(sin(pi/2*R1));
for x = LeftAfterNorm:RightAfterNorm;    
    fx = [fx round(64*( a1 * x.^2 + b1 * x + c1 ))];
end
for y = UpAfterNorm:DownAfterNorm;
    fy = [fy round(64*R2*( a2 * y.^2 + b2 * y + c2))]; 
end
end
 
NonZero_x = find(fx~=0);
NonZero_y = find(fy~=0);
%计算部分自适应比率
for x = 1:size(ImForNorm2 ,2)-1;
     for y =1:size(ImForNorm2 ,1)-1;
         if ((NonZero_x(1)~=1 )&(NonZero_y(1)~=1))
           ImAfterNorm65(fy(y)+1:fy(y+1)+1,fx(x)+1:fx(x+1)+1) = ImForNorm2(y,x);         
         elseif ((NonZero_x(1)~=1)&(NonZero_y(1)==1))
           ImAfterNorm65(fy(y):fy(y+1),fx(x)+1:fx(x+1)+1) = ImForNorm2(y,x);        
         elseif((NonZero_x(1)==1)&(NonZero_y(1)~=1))
            ImAfterNorm65(fy(y)+1:fy(y+1)+1,fx(x):fx(x+1)) = ImForNorm2(y,x);            
         else
             ImAfterNorm65(fy(y):fy(y+1),fx(x):fx(x+1)) = ImForNorm2(y,x);
         end
     end
end
% imshow(ImAfterNorm65);
[Row,Col]=size(ImAfterNorm65);
% for i=1:64
%     for j=1:64
%         imAfterMomentNorm(i,j)=logical(1);
%     end
% end
imAfterMomentNorm(1:64,1:64)=logical(1);
% imshow(imAfterMomentNorm);
if Row>Col
    Margin=round(abs(64-Col)/2);
imAfterMomentNorm(1:64,Margin+1:(Margin+Col)) = ImAfterNorm65(1:64,1:Col);
else if Row<Col
    Margin=round(abs(64-Row)/2);
 imAfterMomentNorm(Margin+1:(Margin+Row-1),1:64) = ImAfterNorm65(1:Row-1,1:64);
    else
  imAfterMomentNorm(1:64,1:64)=ImAfterNorm65(1:64,1:64);   
    end
end
% imAfterMomentNorm1(1:66,1:66)=logical(1);
% imAfterMomentNorm1(2:65,2:65)=imAfterMomentNorm;
% imwrite(imAfterMomentNorm,'NLNresultR2.tif');



⌨️ 快捷键说明

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