📄 bi_momentnormoneword.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 + -