porównywanie obrazów

0

jak porównać jakieśdwa obrazki? np sprawdzić czy są takie same? :) pozdro.

0
var bmp:TBitmap;
      bmp2:TBitmap;
      i,j: word;

begin
   for i:=0 to bmp.width-1 do
     for j:=0 to bmp.height-1 do
       if not (bmp.canvas.pixels[i,j] = bmp2.canvas.pixels[i,j]) then 
          showmessage('Nie równe!!!');

end;
0

bmp.canvas.pixels[i,j] - będziesz czekał wieki :)

poza tym - jeśli jeden z nich będze taki sam, ale rozjaśniony to cała metoda leży ;)

0

no wiec tzw. lipa :(
moze ma ktos jakis pomysk? mozna jakos np. porownujac pixele zaznaczyc dopuszczalna roznice w kolorach? kilka punktow w rgb np. nie wiem. nie robilem tego jeszcze.

pozdro.

0

Napisz więcej szczegółów o co Ci konkretnie chodzi. Mam usilne wrażenie, że nie zdajesz sobie sprawy o co pytasz. Temat jest szeroki i skomplikowany jak rozpoznawanie mowy czy pisma.

Przede wszystkim zacznij od tego:

  • co to za obrazy (dwie ikonki dwukolorowe 16x16 czy zdjęcie kota 5mega pikseli i jego starszego brata)
  • co rozumiesz pod pojęciem obrazy są równe, czy odpowiedź tylko binarna tak/nie czy dopuszczasz "prawie równe" czy też wręcz "74.345% równe".
    itp

Pozdrawiam

0

no wiec tzw. lipa :(
moze ma ktos jakis pomysk? mozna jakos np. porownujac pixele zaznaczyc dopuszczalna roznice w kolorach? kilka punktow w rgb np. nie wiem. nie robilem tego jeszcze.

pozdro.

Oczywiście, że można tylko że to zajmie więcej czasu, bo musisz sprawdzić czy r jest większe od r z drugiego obrazka i czy jest mniejsze o dopuszczalną ilość. To samo dal składowych g i b. W najlepszym przypadku będą tylko 3 if'y, w najgorszym 6. Pomnóż razy rozmiar obrazka, a potem poczytaj lepiej o wątkach

0

a może :

function Porownaj(Image1, Image2: TImage) : integer;
var x, y: integer;
  liczba: LongInt;
  punkt1, punkt2: PByteArray;
  procent: double;
const max_roznica=5;

begin
  liczba:=0;
  for y:=0 to image1.Picture.Bitmap.height-1 do begin
    punkt1:=image1.Picture.Bitmap.scanline[y];
    punkt2:=image2.Picture.Bitmap.scanline[y];
    for x:=0 to image1.Picture.Bitmap.width-1 do
      if abs(punkt1[x]-punkt2[x])>max_roznica then 
        inc(liczba);
    if image1.Picture.Bitmap.height*image1.Picture.Bitmap.width>0 then 
      procent:=100*(liczba/(image1.Picture.Bitmap.height*
      image1.Picture.Bitmap.width))
    else
      procent:=0;
    Result := 100-round(procent);
  end;
end;
Teraz jeszcze tylko posłużmy się nią 

Label1.Caption:= 'Rysunki podobne są do siebie w '+
IntToStr(Porownaj(Image1,Image2))+' procentach';
0

Ciekawy sposób...

0

Ciekaw jestem co to znaczy, ze obrazki sa rowne...
Chyba maja takie same rozmiary :)

A jak juz tak chcecie sie bawic w podobienstwa to oto przyklad, ktory przy waszej definicji (roznienia sie o X) jest ciezki do sprawdzenia. Dla ulatwienia skala szarosci 0-255
Mamy obraz, ktory sklada sie z 2 pasow:
obraz I:

  • pas czarny (0),
  • pas szary (128).
    obraz II:
  • pas szary (127),
  • pas bialy (255).
    Jezeli przyjmiemy, ze prog roznicy wynosi < 127, to te 2 obrazki sa rozne. A przeciez to ten sam ksztalt, tylko rozjasniony mocno.
    Wiec przyjmijmy prog 127.
    Teraz mamy takie obrazy jednobarwne:
    obraz I:
  • kolor czarny (0)
    obraz II:
  • kolor szary (120)
    Roznia sie jedynie o 120, wiec spelniaja nasze kryteria. Nie sa rozne! W koncu "czarne jest czarne, a biale jest biale", a co z szarym? Szary to nie czarny, wiec jak dla mnie ta definicja tez nie jest dobra...

Tak wiec nie porownujcie obrazow, czy sa rowne, a jedynie sprawdzajacie, czy 2 obrazy spelniaja pewne kryteria (nie majace jak widac wiele wspolnego z podobienstwem).

1 użytkowników online, w tym zalogowanych: 0, gości: 1