помогите разобраться в коде. выложу всю программу. Программа сегментации путем выбора глобального порога. берутся буквы на сером фоне, вырезаются на белый фон. Интересует небольшая часть кода. | Код | unit lab1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, TeEngine, Series, TeeProcs, Chart, math, ComCtrls;
type TForm1 = class(TForm) Image1: TImage; BitBtn1: TBitBtn; OpenDialog1: TOpenDialog; BitBtn2: TBitBtn; Image2: TImage; Chart1: TChart; Series1: TBarSeries; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); Procedure gist; private { Private declarations } public { Public declarations } end;
var Form1: TForm1; M: array [0..255] of integer; ser, pix: integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); begin if OpenDialog1.Execute then Image1.Picture.LoadFromFile(OpenDialog1.FileName); end;
procedure TForm1.BitBtn2Click(Sender: TObject); var i,j,r,ind1,ind2,max,min,indmax,indmin:integer; myColor : TColor; k:byte; s:real; mas:array of integer; begin gist;
for i:=1 to 255 do if m[i]<>0 then begin ind1:=i; break; end;
for i:=255 downto 1 do if m[i]<>0 then begin ind2:=i; break; end;
//находим максимум max:=m[ind1]; for i:=ind1+1 to ind2 do if max<m[i] then begin max:=m[i]; indmax:=i; end;
i:=0; j:=0; s:=0; while i<=250 do begin if (indmax>i)and(indmax<i+50)then begin ind2:=i; if 255-indmax<indmax then begin while j<i do begin for k:=j to j+50 do s:=s+m[k]; s:=s/50; setlength(mas,length(mas)+1); mas[(round(j/50))]:=round(s); j:=j+50; end; break; end; end; i:=i+50; end;
s:=mas[0]; for i:=1 to length(mas)-1 do if s<mas[i] then begin s:=mas[i]; ind1:=50*i+50; end;
min:=m[ind1]; for i:=ind1 to ind2-1 do if min>m[i+1]then begin min:=m[i+1]; indmin:=i+1; end;
for i:=1 to Form1.Image1.Width do begin for j:=1 to Form1.Image1.Height do begin myColor := Form1.Image1.Canvas.pixels[i,j]; R:= GetRValue(MyColor); if R<indmin then Image2.Canvas.Pixels[i,j]:=RGB(round(R),round(R),round(R)); end; end; end;
Procedure TForm1.gist; var i,j,r,g,b,s:integer; myColor : TColor; begin Form1.Chart1.Series[0].Clear; for i:=0 to 255 do M[i]:=0; for i:=1 to Form1.Image1.Width do begin for j:=1 to Form1.Image1.Height do begin myColor := Form1.Image1.Canvas.pixels[i,j]; R:= GetRValue(MyColor); M[R]:=M[R]+1; end; end; for i:=0 to 255 do begin Form1.Chart1.Series[0].AddXY(i,M[i]) end; end; end.
|
Что именно интересует, для чего в коде ind1:=50*i+50; как я понял, это деление гистограммы или как. Что если поменять на 100 и 20, особо ничего не изменилось. а если поставить 50 и 100, то будут перенесены лишь части букв... не могу разобрать | Код | s:=mas[0]; for i:=1 to length(mas)-1 do if s<mas[i] then begin s:=mas[i]; ind1:=50*i+50; end;
|
|