jak porównać jakieśdwa obrazki? np sprawdzić czy są takie same? :) pozdro.
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;
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 ;)
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.
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
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
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';
Ciekawy sposób...
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).