Как преобразовать Y Cb Cr в RGB в MATLAB вручную?
Мне было поручено выполнить субдискретизацию цветности 4:2:0 (сжатие цвета) для серии файлов JPEG.
Первый шаг - убедиться, что я могу сгенерировать свои значения Y, Cb и Cr, а затем преобразовать их обратно в RGB и отобразить изображение. Затем я могу вернуться и добавить свою логику подвыборки.
Я почти уверен, что у меня есть правильные формулы для генерации значений 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 ответ
Вам необходимо настроить формулу преобразования на диапазон компонентов 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.