Algorytm porównywujący zmiany w bitmapie

0

Poszukuje funkcji ktora porownalaby 2 bitmapy i poinformaowala jak znacznie sie roznia. Inaczej abym mogl sprawdzic czy na bitmapie nie pojawil sie jakis prostokat innego koloru niz tlo o rozmiarach 1/5 bitmapy. Gdzie to szukac, a moze ktos juz widzial?

0

Nigdy nie spotkałem się z żadnym takim algorytmem, chociaż coś w tym stylu napisałem kiedyś. Tzn, program liczy różnicę między wartościami kolejnych pixeli w dwóch bitmapach, i wartość bezwzględną tej różnicy dodaje do, powiedzmy licznika. Wygląda to tak:

function CompareBitmaps(b1,b2:TBitmap):cardinal;
var x,y:integer;
begin
 Result:=0;
 for y:=0 to b1.Height-1 do     //zakładam, że obie bitmapy mają ten sam rozmiar
  for x:=0 to b1.Width-1 do
   Result:=Result+abs(GetRValue(b1.Canvas.Pixels[x,y])-GetRValue(b2.Canvas.Pixels[x,y]))+abs(GetGValue(b1.Canvas.Pixels[x,y])-GetGValue(b2.Canvas.Pixels[x,y]))+abs(GetBValue(b1.Canvas.Pixels[x,y])-GetBValue(b2.Canvas.Pixels[x,y]));
end;

Oczywiście można to bardzo łatwo zrobić szybciej z użyciem ScanLine'a, ale piszę z głowy, a nie chciałbym się pomylić ;-).

0

Do tego zapisujesz sobie minimalne i maxymalne wartości x oraz y, przy których wystąpiły róznice (x,y niezależnie od siebie) i tak uzyskujesz współrzędne najmniejszego pojedynczego prostokąta w którym zaszły zmiany. Gdybys skomplikował i uzył do zapamietania zmienionych punktów regionów... Uzyskałbys figurę, której punkty byłby punktami zmienionymi.

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