Сохранение изображения в OpenCV увеличивает размер изображения - PullRequest
0 голосов
/ 14 октября 2019

Я уже задавал этот вопрос, но не получил удовлетворительных ответов, поэтому я провел больше исследований и ставлю этот вопрос лучше. Я читаю изображение методом OpenCV imread. И я сохранил его, используя метод imwrite. Это увеличивает размер выходного файла более чем в два раза.

Ниже приведены сведения об изображениях, которые я получил из imagemagick ( Я не записал все детали, я прикрепляю изображения для всехнеобходимы данные ):

Входное изображение:

  • Формат: JPEG (формат JFIF Объединенной группы фотографических экспертов)
    • MIME-тип: image / jpeg
    • Класс: DirectClass
    • Геометрия: 1836x3264 + 0 + 0
    • Разрешение: 72x72
    • Размер отпечатка: 25,5x45.3333
    • Единицы: PixelsPerInch
    • Тип: TrueColor
    • Endianess: Не определено
    • Цветовое пространство: sRGB
    • Глубина: 8-бит
    • Глубина канала: красный: 8-битный зеленый: 8-битный синий: 8-бит
    • Статистика канала: Пиксели: 5992704
    • Сжатие: JPEG
    • Качество: 75
    • Размер файла: 267 КБ
    • Число пикселей: 5,993 М

Выходное изображение:

  • Формат: JPEG (формат JFIF Объединенной группы экспертов по фотографии)
    • Тип MIME: изображение / JPEG
    • Класс: DirectClass
    • Геометрия: 1836x3264 + 0 + 0
    • Единицы: Не определено
    • Тип: TrueColor
    • Порядковый номер: Не определено
    • Цветовое пространство: sRGB
    • Глубина: 8-битная
    • Глубина канала: красный: 8-битный зеленый: 8-битный синий: 8-битный
    • Статистика канала: Пиксели: 5992704
    • Сжатие: JPEG
    • Качество: 95
    • Размер файла: 611 КБ
    • Число пикселей: 5,993 М

Как видно, размер входного изображения составляет 267 КБ, но на выходеразмер изображения оказался 611КБ. Теперь я знаю, что его размер зависит от кодера, значения компрессии, скорости передачи данных и т. Д. Я хочу знать, есть ли способ сохранить изображение точно такого же размера, что и входное изображение.

Я также пытался использовать сжатие в openCV, как это cv2.imwrite('result.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 45]) Здесь качество изображения будет 45, но размер изображения будет все же больше, чем входное изображение (около 300 КБ). Я не хочу идти меньше 45, потому что это повлияет на детали изображения и потерю данных.

Я попытался использовать внешние библиотеки, такие как scipy, matplotlib. Но все они независимо от размера изображения.

Любая подсказка о том, почему выходное изображение увеличивается и как мы можем это исправить, очень ценится. Благодарю.

Вот код для справки

import cv2 #opencv library for image processing implementations 

def main():   
    im = cv2.imread('sample.jpg')
    cv2.imwrite('result.jpg', im)
    if(__name__=='__main__'):
      main()

А вот изображение для справки. Sample Image

1 Ответ

1 голос
/ 14 октября 2019

Исходное изображение имеет качество 75. Если вы не определяете качество сохранения в OpenCV, по умолчанию используется значение 95, поэтому следует ожидать, что файл будет больше.

Если вы хотите установить его внекоторый максимальный размер, вы можете использовать ImageMagick , например, чтобы установить его, скажем, 300 КБ:

convert sample.jpg -define jpeg:extent=300k a.jpg

И это даст вам файл размером 299 810 байт с качеством 83.

Если вы готовы разрешить 400 КБ, вы можете использовать:

convert sample.jpg -define jpeg:extent=400k a.jpg

, и вы получите 358 000 байт файла с качеством 93.


Я написал нечто похожее на Python, чтопозволяет сохранить в указанном размере с помощью бинарного поиска здесь .

...