OpenCV - imread (), imwrite () увеличивает размер png?

Я хотел опробовать несколько простых операций с файлами и начал с открытия и сохранения файлов (я использую Python)

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

После этой операции мой исходный image размером 33 КБ трансформируется в такое же изображение размером 144 КБ.

Я пробовал сделать что-то вроде этого: 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)

Но это не сильно меняет (размер уменьшился до 132кБ)

Это изображение, с которым я работаю:

введите описание изображения здесь


person Patryk    schedule 31.08.2012    source источник
comment
У меня была такая же проблема со сжатием png. Переход на scikit-image и использование его imsave творит чудеса.   -  person letmaik    schedule 12.09.2014


Ответы (4)


Некоторые разработчики png, такие как GIMP, пишут сжатые файлы PNG намного лучше, чем стандартный libpng, который используется opencv. Вы также можете снова открыть и сохранить изображение с помощью Imagemagick и посмотреть, какая разница (по сравнению с OpenCV).

Существует даже специализированное программное обеспечение, которое пытается лучше повторно сжимать PNG, например pngcrush.

Можете ли вы предоставить рассматриваемое изображение? Я бы хотел поиграть с этим, касательно оптимизации размера файла.

person ypnos    schedule 31.08.2012
comment
Я добавил изображение, с которым работаю. Учитывая ваш ответ - я понимаю, что есть программы, которые позволят мне уменьшить размер png, но я хотел бы использовать функциональность OpenCV. - person Patryk; 31.08.2012
comment
Вы предоставили файл JPEG вместо исходного PNG, поэтому я не могу смотреть на сжатие. Но кроме этого: вы не получите лучшего сжатия через OpenCV. И последнее: вы храните 16-битные изображения вместо 8-битных. Это происходит, если вы используете матрицу CV_16U. - person ypnos; 31.08.2012

Как намекнул ypnos, ваш исходный файл - jpg (даже если он имеет расширение png). Вот почему, когда вы сохраняете его в формате png, он будет занимать больше места, так как вы меняете формат (jpg на png).

Попробуйте заменить последнюю строку на:

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

И вы увидите, что размер не сильно изменился.

В качестве альтернативы, оставьте код как есть, но используйте другое изображение, например http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

person Jose Gómez    schedule 26.05.2014

Наполовину связанный, но у меня была та же проблема с matplotlib.image.imsave - он сохранял 8-битное изображение в оттенках серого как 16-битное, что увеличивало размер даже после использования scipy.misc.bytescale, чтобы убедиться, что это 8-битный массив. Однако scipy.misc.imsave правильно сохранил его как 8-битное изображение.

person Brian Burns    schedule 06.08.2015

Вы можете использовать сторонний инструмент командной строки optipng, чтобы повторно сжать и уменьшить размер файла png без каких-либо потерь.

Ссылка:

http://optipng.sourceforge.net/pngtech/optipng.html

https://github.com/johnpaulada/optipng

person Eric    schedule 07.12.2018