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;