Размер байта памяти в формате JPEG из OpenCV imread не выглядит правильным

1

Использование OpenCV, всякий раз, когда я сохраняю изображение (из потока камеры) как JPG на диск. Размер файла в байтах на диске отличается в зависимости от качества JPEG, как ожидалось.

Однако всякий раз, когда я читаю изображения независимо от размера файла на диске, размер памяти остается постоянным. Это нормально?

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

Например, для

import sys
import cv2

cv2.imwrite('temp.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 10])
# disk size of temp.jpg is 24kb

image = cv2.imread('temp.jpg')
# memory size is 2.7 mb

cv2.imwrite('temp.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
# disk size of temp.jpg is 150kb

image = cv2.imread('temp.jpg')
# memory size is still constant at 2.7 mb

Вот как я вычисляю размер памяти:

print("Image byte size :", round(sys.getsizeof(image) / (1024 * 1024), 2), "mb")
Теги:
opencv
image
jpeg

1 ответ

2

Да, это абсолютно нормально. Все форматы изображений на самом деле являются различными способами сжатия mxn матрицы mxn RGB. JPG относительно лучше PNG с точки зрения пространства. Также обратите внимание, что это относительное поведение происходит за счет стоимости: JPG - метод сжатия с потерями, но PNG - метод сжатия без потерь.

Когда мы читаем изображение с JPG или PNG с диска, оно сначала несжатое, а затем данные матрицы заполняются. Размер памяти всегда будет: mxnx 3 байта, но размер диска будет отличаться в зависимости от используемого формата сжатия, уровня сжатия и т.д. Он также может варьироваться для разных градиентов изображений. Изображение с одним цветом займет гораздо меньше места в формате JPG, чем изображение с большим количеством цветов (градиентные изображения). Но размер памяти обоих изображений будет таким же: mxnx 3 байта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню