Porównywanie obrazów

0

Witajcie :),

Mam dwa obrazki. Różnią się od siebie w jednym lub killu miejscach. Potrzebuje znaleźć prostokątny obszar ( X i Y górnego lewego oraz długości boków ), który zawierałby fragment obrazu zawierającego wszystkie odszukane zmiany. Jedyny sposób jaki mi przychodzi do głowy to brutalnie sprawdzenie piksel po pikselu każdego obrazka, ewentualnie sprawdzanie np co 10 piksela i wyznaczanie obszaru trochę większego( z drugiej strony nie mam gwarancji, że zmiana nie umknie mi między tymi sprawdzonymi).
Czy macie może jakieś lepsze pomysły na rozwiązanie tego problemu?

0

Ale dlaczego nie sprawdzić całego obrazu? Przecież jest to proces bardzo szybki. Jeśli masz pewność, że zmiany nie będą dotyczyły pojedynczych pikseli i ich nie przegapisz, możesz przeszukać co któryś, ale w przeciwnym wypadku proponuję odjąć od siebie obrazy i sprawdzać, czy w obrazie wynikowym w danym miejscu jest czerń (różnica zerowa) czy też jakiś odcień (różnica niezerowa).

0

Jeśli już mowa o takim programiku, dobrym pomysłem było by dodanie, żeby wyświetlał w ilu procentach jeden obrazek jest podobny do drugiego. Czyli np. jaki procent wszystkich pikseli stanowią piksele identyczne w obu obrazkach.

0

czy jezyk, biblioteki itp pozwalaja ci na wykorzystywanie scanline'ow?

bo przychodza mi glowy 2 pomysly na rozwiazanie tego.

0

Co do wydajności to jedno wykonanie mogłoby być mało wydajne, ale obrazy mogą się często zmieniać i będę porównywał zawsze ostatnie dwa. Porównywanie piksel po pikselu na dość wolnym kompie mimo wszystko zajmuje za dużo.

Blejs napisał(a)

Czyli np. jaki procent wszystkich pikseli stanowią piksele identyczne w obu obrazkach.
Raczej poszukuję prostokąta, w którym można objąć wszystkie zmiany, szczegóły mało mnie obchodzą.

Karolaq napisał(a)

czy jezyk, biblioteki itp
Język jak na razie to Delphi ( Object Pascal, czy jakby go tam nie zwać).

0

no to tak:
W - dlugosc obrazka, H - wysokosc

zeby ustalic paramtery prostokata potrzebujemy znac takie piksele, jak:
pierwszy i ostatni od gory piksel, kto sie rozni
piksel najblizszylewej krawedzi i piksel najblizszy prawej krawedzi.

teraz pytanie, jak szukac? wydajnosc zalezy od tego, jak dostosujesz algorytm do tego obrazka. jezeli wiesz, ze obszary rozniace sie nie moga byc jednopikselowe, to nie ma sensu sprawdzac kazdej linijki. ale zalozmy, ze moga:

glowna petla wykonujaca sie 1/2H razy.
w je srodku porownujemy scanline'ami kolejne wiersze od dolu i od gory.
jezeli znajdziemy wiersze, ktore sie roznia, to wykonujemy taka sekcje:
{
petla wykonujaca sie 1/2
W razy
porownujemy od lewej i od prawej poszczegolne piksele. jezeli znajdziemy 2 takie piksele, to petla sie konczy.
}

dobra, ale teraz optymaliacja do tego. dajmy na to, ze pierwszy roznicy pixel to [10,4].
na pewno prostokat bedzie zaczynal sie w punkcie [x,4].
niby x mozna znalezc, po prostu szukajac tak jak podalem, ale:
nie ma sensu przeszukiwac dalszych punktow niz: [0,4] - [9,4]
podobne ograniczenie szukania mozemy zastosowac od prawej strony, jezeli znamy ostatni pixel.

i jak wiadomo, jezeli znasz jakies cechy tych zmian, to mozna kombinowac i optymalizowac bardziej. troche juz pozno i nie chce mi sie zbytnio wnikac, ale chyba zwiekszenie ilosci scanline'ow moze tez przyspieszyc algorytm.

0

coś podobnego kombinowałem i kombinuję, jak coś sklecę to napiszę jak zrobiłem

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