Размер байта памяти в формате JPEG из OpenCV imread не выглядит правильным - PullRequest
0 голосов
/ 04 декабря 2018

Использование 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")

1 Ответ

0 голосов
/ 04 декабря 2018

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

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

...