2012-08-31 17 views
5

chciałem wypróbować kilka prostych operacji na plikach i zacząłem z plikami otwierania i zapisywania (używam Python)OpenCV - imread(), imwrite() zwiększa rozmiar png?

image = cv2.imread("image.png") 
cv2.imwrite("image_processed.png", image) 

Po tej operacji mój oryginalny image od 33kB przekształca się tym samym poszukuje 144KB obrazu.

próbowałem robić coś takiego: http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite

params = list() 
    params.append(cv.CV_IMWRITE_PNG_COMPRESSION) 
    params.append(8) 

    image = cv2.imread("image.png") 
    cv2.imwrite("image_processed.png",image,params) 

Ale to nie zmienia wiele (wielkość zmniejszyła się do 132KB)

To jest obraz, który pracuję z:

enter image description here

+0

miałem ten sam problem z kompresją PNG. Przejście na 'scikit-image' i użycie jego' imsave' zdziałało cuda. – letmaik

Odpowiedz

5

Niektórzy pisarze png jak GIMP pisać znacznie lepiej niż PNG skompresowanych standardowym libpng, który jest używany przez opencv. Możesz także ponownie otworzyć i zapisać obraz za pomocą Imagemagick i zobaczyć, jaka to różnica (w porównaniu do OpenCV).

Istnieje nawet specjalistyczne oprogramowanie, które stara się lepiej ponownej kompresji PNG, jak pngcrush.

można dostarczyć zdjęcie na pytanie? Chciałbym się z tym pogodzić, jeśli chodzi o optymalizację rozmiaru pliku.

+0

Dodałem obraz, nad którym pracuję. Biorąc pod uwagę twoją odpowiedź - zdaję sobie sprawę, że istnieją programy, które pozwolą mi zmniejszyć rozmiar png, ale chciałbym użyć funkcjonalności OpenCVs. – Patryk

+1

Podałeś plik JPEG zamiast oryginalnego PNG, więc nie mogę naprawdę przyjrzeć się kompresji. Ale poza tym: Nie uzyskasz lepszej kompresji za pośrednictwem OpenCV. Ostatnią rzeczą może być przechowywanie 16-bitowych obrazów zamiast 8-bitowych. Dzieje się tak, jeśli używasz matrycy CV_16U. – ypnos

2

Jak zasugerował przez ypnos, plik źródłowy jest jpg (nawet jeśli ma rozszerzenie png). Dlatego, gdy zapiszesz go w formacie png, użyje on więcej miejsca, ponieważ zmieniasz format (jpg na png).

spróbować wymienić ostatnią linię z:

cv2.imwrite("image_processed.jpg",image,params) 

I widać, że rozmiar nie tyle zmienić.

Alternatywnie zachować kod jak to jest, ale użyć innego obrazu, takich jak http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

0

związane Naczepa, ale miałem ten sam problem z matplotlib.image.imsave - byłoby zapisać 8-bitowej skali szarości jako 16 -bitowa, który rozrósł się do rozmiarów, nawet po użyciu scipy.misc.bytescale, aby upewnić się, że to tablica 8-bitowy. Jednak scipy.misc.imsave zapisał go poprawnie jako obraz 8-bitowy.

Powiązane problemy