Witam

Od pewnego czasu staram się rozwiązać problem zliczania obiektów na obrazie. Doszedłem do tego jak liczyc obiekty, ktore maja osie prostopadle (równolegle) do krawedzi, czyli prostokaty i kwadraty. Natomiast po zastosowaniu tego algorytmu na na koloach lub elipsach wychodza "szopki". Ponizej przedstawiam algorytm i jesli ktokolwiek zna przyczyne dlaczego sie tak dzieje to prosze o pomoc:

procedure TForm1.Button10Click(Sender: TObject);
var
 a,r1,g1,b1,j,i,kolor1:integer;
 L,B,x5:integer;
 x11,x22,x33,x44,x55:integer;
 tab: array[1..255]of integer;
 Obraz: array of array of integer;
begin
setlength(obraz,image3.Picture.Width,image3.Picture.Height);
{for a:=1 to 255 do begin
tab[1,a]:=a;
end;}

L:=0;
    for i:=2 to image3.Picture.Height do
    begin
      for j:=2 to image3.Picture.Width do
        begin
      
        x5:=image3.canvas.pixels[j,i];

        x11:=image4.canvas.pixels[j-1,i-1];
        x22:=image4.canvas.pixels[j-1,i];
        x33:=image4.canvas.pixels[j-1,i+1];
        x44:=image4.canvas.pixels[j,i-1];


        if x5=rgb(0,0,0) then
          begin
            if ((x11 and x22 and x33 and x44)=rgb(255,255,255))then
              begin
              L:=L+1;

                tab[L]:=L;
                image4.Canvas.Pixels[j,i]:=rgb(tab[L],tab[L],tab[L]);

              end
              else
            if (((x11 or x22 or x33 or x44)=rgb(255,255,255))or((x11 or x22 or x33 or x44)=rgb(tab[L],tab[L],tab[L]))) then
              begin
                image4.Canvas.Pixels[j,i]:=rgb(tab[L],tab[L],tab[L]);
              end
              else

        if (((x11 or x22 or x33 or x44)=rgb(tab[L],tab[L],tab[L])) and ((x11 or x22 or x33 or x44)=rgb(tab[L-1],tab[L-1],tab[L-1]))) then
        begin

              image4.Canvas.Pixels[j,i]:=rgb(tab[L-1],tab[L-1],tab[L-1]);
               end;
             end;
             if x5<>rgb(0,0,0) then begin
             image4.Canvas.Pixels[j,i]:=x5;
             end;
           end;
             // obraz[j,i]:=L;
             label6.Caption:=floattostr(L);
             application.ProcessMessages;
        end;


       end;