Сжатие изображения - PullRequest
       49

Сжатие изображения

1 голос
/ 02 ноября 2019

У меня есть цветовая палитра такая, что есть 4 цвета. Эти цвета - белый, зеленый, желтый и оранжевый. Значения RBG для этих цветов соответственно: (255, 255, 255) (0, 255, 0) (255, 120, 0) (255, 255, 0). Изображение представляет собой RGB-изображение размером 8 x 8 пикселей. Я хочу подсчитать, сколько бит необходимо для хранения этого сжатого изображения.

Я не уверен, поскольку у нас есть четыре цвета, если для хранения кода потребуется 2 или 3 бита. Первоначально я думал, что это 2, потому что 2 ^ 2 = 4, но теперь, потому что оранжевый и желтый не являются окончательными цветами RGB, нам нужно 3 бита?

С тех пор я знаю, как сделать расчет сжатия, я просто хотел быобъяснение того, сколько бит необходимо для хранения кода

1 Ответ

0 голосов
/ 03 ноября 2019

Есть 4 возможных цвета, поэтому вам нужно 2 бита на пиксель.

Ваша первоначальная мысль верна, 2 ^ 2 = 4, и 2 бита могут представлять 4 различных значения: в двоичном виде: 00, 01, 10, 11 (в десятичном виде: 0, 1, 2, 3).

Каждое значение представляет индекс в цветовой карте .
Цветовая карта используется для сопоставления от 0 до (255, 255, 255), 1 тп (0, 255, 0) От 2 до (255, 120, 0) и от 3 до (255, 255, 0).

Изображение имеет размер 8x8 пикселей, поэтому общее количество необходимых битов составляет 8 * 8 * 2 = 128 биты (16 байтов).

Когда вам нужно распаковать изображение, есть две возможности:

  • Первый вариант: декодер заранее знает 4 цвета - нет необходимости хранить карту цветов со сжатымобраз.
  • Второй вариант: необходимо сохранить карту цветов со сжатым изображением, поэтому для хранения карты цветов необходимы дополнительные биты.

Поскольку ваш вопрос сформулирован, я уверен, что первый вариант верен (вам не нужно хранить дополнительные «биты» для цветовой карты).


Чтобы сделать мысли более интересными, я кодировал следующий образец MATLAB:

RGB = imread('peppers.png');   %Read input RGB image.
RGB = imresize(RGB, [64, 64]); %Reduce size to 64x64 (jsut for the example).

%Convert image to indexed image with 4 color.
[X, cmap] = rgb2ind(RGB, 4);
J = ind2rgb(X, cmap);

%Replace indices of color map:
cmap(1, 1:3) = [255, 255, 255]/255; %Fist color is white (255, 255, 255)
cmap(2, 1:3) = [0, 255, 0]/255; %Second color is green (0, 255, 0)
cmap(3, 1:3) = [255, 255, 0]/255; %Second color is yellow (255, 255, 0)
cmap(4, 1:3) = [255, 120, 0]/255; %Second color is orange (255, 120, 0)

K = ind2rgb(X, cmap);

figure;imshow(RGB);
figure;imshow(J);
figure;imshow(K);

Входное изображение RGB (истинный цвет):
enter image description here

Индексированное изображение только с 4 цветами («сжатое» изображение):
enter image description here

Изображение после замены цвета на белый, зеленый, желтый и оранжевый(в произвольном порядке):
enter image description here

Иллюстрация для изображения 8x8 с 4 цветами, в виде матрицы 8x8:

3,3,3,3,3,3,3,3
3,3,3,3,3,0,3,3
3,0,0,0,0,0,0,0
3,0,0,2,2,2,1,1
1,2,1,2,2,1,1,1
1,1,2,1,0,1,1,2
1,0,0,3,3,3,3,2
3,3,3,3,3,3,3,3

Иллюстрация цветовой карты:

0 -->    (255   255   255)
1 -->    (  0   255     0)
2 -->    (255   255     0)
3 -->    (255   120     0)

Для хранения цветовой карты вам необходимо 4 * 3 * 8 = 96 бит (при условии, что значение, например 255, требует 8 бит).

...