Как конвертировать Y Cb Cr в RGB в MATLAB вручную? - PullRequest
1 голос
/ 26 февраля 2020

Мне было поручено выполнить подвыбор цветности 4: 2: 0 (сжатие цветов) для серии JPEG.

Первый шаг - убедиться, что я могу сгенерировать свои значения Y, Cb и Cr, а затем преобразовать обратно в RGB и отобразить изображение. Затем я могу go вернуться назад и добавить свои логи субсэмплинга c.

Я почти уверен, что у меня есть правильные формулы для генерации значений Y, Cb и Cr, но я не могу понять правильные способ вернуться в RGB и распечатать.
Нам не разрешено использовать какие-либо встроенные функции (что обычно появляется при решении этой проблемы).

Я приложил код того, как я получаю свои значения Y Cb и Cr и как я пытаюсь вернуться в RGB.
В настоящее время я получаю зеленый экран при запуске «imshow» на newImage после этой выдержки.

%Obtain R,G,B values
R=double(orig(:,:,1))./255;
G=double(orig(:,:,2))./255;
B=double(orig(:,:,3))./255;

%Calculate Y,Cb, Cr values
Y = (0.299*R) + (0.587*G) + (0.114*B) + 0;
Cb = (-0.168736*R) + (-0.331264*G) + (0.5*B) + 0.5;
Cr = (0.5*R) + (-0.418688*G) - (0.081312*B) + 0.5;

%Calculate new R,G,B
new_R = Y + (1.402*(Cr-128));
new_G = Y-(0.34414*(Cb-128))-(0.71414*(Cr-128));
new_B = Y+(1.772*(Cb-128));

%Fill new Image
newImage(:,:,1) =double(new_R).*255;
newImage(:,:,2) = double(new_G).*255;
newImage(:,:,3) = double(new_B).*255;

Где orig - исходное изображение, а newImage - то, что я запускаю «imshow» сразу после этой выдержки.

1 Ответ

0 голосов
/ 27 февраля 2020

Вам необходимо настроить формулу преобразования для диапазона компонентов RGB:

  • Если диапазон цветовых компонентов составляет [0, 255], вам необходимо добавить 128 в Cb , Cr при преобразовании RGB в YCbCr (и вычесть 128 при обратном преобразовании).
  • Если диапазон цветовых компонентов равен [0, 1], вам нужно добавить (или вычесть) 0,5

В вашем сообщении вы используете диапазон [0 , 1] для преобразования RGB в YCbCr, но формула, которую вы используете для преобразования обратно из YCbCr в RGB, соответствует диапазону [0, 255] (вы вычитаете 128).

Вы можете исправить это, вычтя 0,5 вместо 128.

Пример:

%Sample values for testing (in range [0, 1]):
R = 0.3;
G = 0.6;
B = 0.8;

%Calculate Y,Cb, Cr values
Y = (0.299*R) + (0.587*G) + (0.114*B) + 0;
Cb = (-0.168736*R) + (-0.331264*G) + (0.5*B) + 0.5;
Cr = (0.5*R) + (-0.418688*G) - (0.081312*B) + 0.5;

%Calculate new R,G,B
new_R = Y + (1.402*(Cr-0.5));
new_G = Y-(0.34414*(Cb-0.5))-(0.71414*(Cr-0.5));
new_B = Y+(1.772*(Cb-0.5));

display([new_R, new_G, new_B])

Результат:

0.3000    0.6000    0.8000

Как видите, новый RGB равен исходным значениям RGB.

...