PSNR

Tematyka związana z tworzeniem aplikacji w LabVIEW do obsługi wizji oraz wszelkich operacji na obrazie.
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

PSNR

Post autor: oczekp »

Witam ostatnio realizuję program liczący wskaźnik PSNR dla obrazu referencyjnego i po kompresji. Wydaję mi się, że wszystko działa ok, tylko, że wolno. Moje pytanie czy możecie zerknąć na kod i podsunąć mi pomysły jak zrobić,by szybciej działał program, subvi liczył się szybciej.
Opiszę mniej więcej jak to działa.
Program wczytuję ścieżki plików oryginalnych i tych po kompresji. Przerabia go na 3 tablice RGB o typie danych I16. No właśnie czemu te I16. Wg wzoru PSNR
http://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio muszę odjąć obrazki od siebie. Jak się odejmuje w LAbview przy U8 to zauważyłem,że jak druga wartość piksela jest większa od pierwszej to program zaczyna zmniejszać od 255 i później podnosząc to do kwadratu otrzymuje się kosmicznie duze wartości i psnr wychodzi niezgodny z prawdą, więc przerabiam tabele na i16<-co też niestety pobiera czas. Po przerobieniu na tablice obliczam dla poszczególnych składowych RGB. No i da się tu coś poprawić, żeby to działało szybciej, lepiej? Proszę o wszelkie sugestie.

Ze względu, że pliki bmp zajmują sporo miejsca, to wrzuciłem tylko po 3 klatki dla każdego i jeszcze przerobione na jpg. Więc w programie trzeba zmienić ścieżkę, gdzie zainstulejcie pliki oryginalne 000.jpg, 001.jpg, 002.jpg z folderu oryg i po kompresji z folderu 15.
Ilość plików bmp, które były wczytywane to 148 klatek. Więc w sumie porównywanych jest 2x148 klatek.
Jeszcze screen performance u mnie przy porównywaniu po 148 klatek oryginalnych z 148 po kompresji:
Obrazek

Wkradł się błąd i załączyłem zły plik konwersji do tablicy, powinien być ten drugi, który załączyłem oddzielnie.

Jeszcze dorzucam pliki w formie graficznej:
Główny program:
http://img834.imageshack.us/img834/8787/maind.jpg
Obraz->Tablica:
http://img834.imageshack.us/img834/9457/conversion.jpg
PSNR:
http://img836.imageshack.us/img836/4407/psnr.jpg

i jeszcze jeden performance:
http://img837.imageshack.us/img837/9964/razzz.jpg
Załączniki
conversion.vi
(46.73 KiB) Pobrany 370 razy
PSNR.zip
(1.51 MiB) Pobrany 364 razy
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: PSNR

Post autor: vugie »

Użyj takiego schematu - powinno trochę przyspieszyć:
immult.png
immult.png (1.7 KiB) Przejrzano 6781 razy
Jak widać tablice są U8, odejmujemy zawsze większą liczbę od mniejszej i dopiero wynik zamieniamy na 16 bitów. Nie używaj kwadratu, bo występuje tu dodatkowa konwersja (czerwona kropka). Zamiast tego mnożenie przez siebie.
Mała poprawka. Właśnie sprawdziłem, że jak zamiast na U16 zamienić na I32, to jest jeszcze szybciej.

PS. Właśnie zauważyłem, że jak przed całą operacją zamienić tablice na jednowymiarowe (Reshape Array), to jest jeszcze trochę szybciej.
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

PSNR

Post autor: oczekp »

hej rzeczywiście jest lepiej. Zobaczyłem tylko jedną rzecz, że jednak najszybciej działa jak najpierw przerabiam image na U16 za pomocą conversion.vi i później wrzucam na PSNR tego typu:
Obrazek
Czasowo zeszło do około 6 sekund. Tak wygląda to z tym I16 i tym PSNR co podałem wyżej:
Obrazek

A tak z tym na U8(psnr takie jak u Ciebie) przy takiej konwersji image to to array:
Obrazek
Obrazek

PS. Faktycznie jak się zrobi reshape to jest jeszcze szybciej- zeszło poniżej 5.9 sekundy :) thx
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

PSNR

Post autor: vugie »

Jeżeli naprawdę chcesz żyłować czas, to nie uzywaj Profilera do pomiarów (spowalnia sam z siebie i to dosyć nieliniowo) tylko mierz czas "ręcznie" za pomoca Tick Count.
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

PSNR

Post autor: oczekp »

vugie naprawdę wielki dzięki, sporo mi pomogłeś. Myślę, że nie ma co też popadać w przesadę, taki wynik spokojnie mi wystarczy na obliczanie PSNR w czasie rzeczywistym. Teraz pora ubrać wszsytko w jakąs ładną całość i zająć się resztą zadania! THX!
ODPOWIEDZ