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:
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
PSNR
-
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Re: PSNR
Użyj takiego schematu - powinno trochę przyspieszyć:
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.
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.
PSNR
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:
Czasowo zeszło do około 6 sekund. Tak wygląda to z tym I16 i tym PSNR co podałem wyżej:
A tak z tym na U8(psnr takie jak u Ciebie) przy takiej konwersji image to to array:
PS. Faktycznie jak się zrobi reshape to jest jeszcze szybciej- zeszło poniżej 5.9 sekundy thx
Czasowo zeszło do około 6 sekund. Tak wygląda to z tym I16 i tym PSNR co podałem wyżej:
A tak z tym na U8(psnr takie jak u Ciebie) przy takiej konwersji image to to array:
PS. Faktycznie jak się zrobi reshape to jest jeszcze szybciej- zeszło poniżej 5.9 sekundy thx
PSNR
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!