it-swarm.com.ru

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 КБ)

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

enter image description here

9
Patryk

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

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

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

6
ypnos

Как подсказал 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

4
Jose Gómez

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

1
Brian Burns

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

Ссылка:

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

https://github.com/johnpaulada/optipng

0
Eric