2012-12-04 27 views
5

Robię manipulację obrazem na obrazach png. Mam następujący problem. Po zapisaniu obrazu z funkcją imwrite(), rozmiar obrazu zostaje zwiększony. Na przykład poprzedni obraz to 847 KB, po zapisaniu staje się 1,20 MB. Oto kod. Właśnie przeczytałem obraz, a następnie go zapisałem, ale jego rozmiar został zwiększony. Próbowałem ustawić parametry kompresji, ale to nie pomaga.Imwrite OpenCV zwiększa rozmiar obrazu png

Mat image; 
image = imread("5.png", -1); 

vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); 
compression_params.push_back(9); 
compression_params.push_back(0); 

imwrite("output.png",image,compression_params); 

Co może być problemem? Proszę o pomoc. Dzięki.

+1

Mam ten sam problem i myślę, że to zależy od bibliotek używanych do kompresowania oryginalnego obrazu i biblioteki png używanej przez OpenCV. –

+0

co to jest -1 w imread? Dlaczego po prostu nie użyjesz imread ("5.png")? –

+0

przy ustawianiu drugiego parametru na -1, imread odczyta przezroczysty obraz PNP, w przeciwnym razie nie zwróci kanału alfa obrazu png – Karmar

Odpowiedz

4

PNG ma kilka opcji, które wpływają na kompresję: poziom kompresji deflate (0-9), strategia deflate (HUFFMAN/FILTERED) i wybór (lub strategia dynamicznego wyboru) dla wewnętrznego filtra błędu prognozowania (AVERAGE, PAETH ...). Wygląda na to, że OpenCV pozwala tylko na zmianę pierwszego i nie ma dobrej domyślnej wartości dla the second. Wydaje się, że musisz z tym żyć.

Aktualizacja: patrząc na sources, wydaje się, że dodano ustawienie strategii kompresji (po complaints), ale nie jest to documented. Zastanawiam się, czy to źródło zostało wydane. Spróbuj ustawić opcję CV_IMWRITE_PNG_STRATEGY z Z_FILTERED i zobacz, co się stanie

+0

Więc nie ma rozwiązania tego problemu z OpenCV? – Karmar

+0

@Karmar: zobacz moją aktualizację – leonbloy

+0

Masz na myśli ustawienie opcji CV_IMWRITE_PNG_STRATEGY_FILTERED? Piszę compression_params.push_back (CV_IMWRITE_PNG_STRATEGY_FILTERED); compression_params.push_back (9); ale nic się nie dzieje. – Karmar