Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > сегментация изображения


Автор: LARG 10.1.2011, 02:12
помогите разобраться в коде. выложу всю программу. Программа сегментации путем выбора глобального порога. берутся буквы на сером фоне, вырезаются на белый фон. Интересует небольшая часть кода.
Код

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;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)