манипулирование яркостью в цветовом пространстве YUV

1

Я не хочу устанавливать контраст/ярлыки на изображении, который находится в байте формы []. Изображение находится в цветовом пространстве YCbCr_420 (камера для Android). Я получаю значение яркости следующим образом:

for (int j = 0, yp = 0; j < height; j++) {
for (int i = 0; i < width; i++, yp++) {
    int y = (0xff & (yuv420sp[yp])) - 16;
    }
}

Как управлять значением y, чтобы установить больше света? Я также не уверен, что это способ избавиться от значения:

yuv420sp[yp] = (byte) ((0xff & y) +16);

Thanx для любой помощи.

Теги:
image-processing
yuv

2 ответа

2

Маленькое, что я знаю из этого API, состоит в том, что значения для 3-х каналов объединены в массив байтов. Точно так же в Windows, работающей с RGB, я предполагаю, что у вас есть то же самое, я имею в виду, каждые 3 байта, представляющие один пиксель. Поэтому я ДОГАДЯ, вы можете получить доступ к нему, прыгая каждые 3 позиции, чтобы получить доступ только к одному каналу (Luma в вашем случае). Я просто не знаю, представлена ​​ли яркость первым, вторым или третьим байтом.

Во-вторых, если я понимаю, что вы просто хотите изменить яркость/контраст (увеличение/уменьшение), это правильно? Потому что, если это так, контраст - это просто умножение, а яркость - добавление.

Например, псевдокод, предполагающий, что вы работаете с 8-битным каналом:

luma[y] = luma[y] * 1.10; //Increases contrast

или вы можете иметь более общую форму:

luma[y] = luma[y] + (luma[y] * contrast); //where contrast ranges from -1.0 to 1.0

Аналогичным образом вы можете сделать то же самое с яркостью:

luma[y] = luma[y] + bright; //Where bright can range from -255 to 255

В обоих случаях вы должны быть осторожны с переполнениями и потоками, прежде чем назначать результат конечного пикселя вашему изображению.

  • 0
    Спасибо Андрес за яркую / контрастную информацию. Способ получения значения y работает хорошо, это способ вернуть y правильно (нужна маска?): Yuv420sp [yp] = (byte) ((0xff & y) +16);
  • 0
    Привет, значит, эта часть кода: yuv420sp [yp] = (byte) ((0xff & y) +16) неверна (изображение просто зеленое), пожалуйста, кто-нибудь может подсказать, как правильно установить значения в YUV?
Показать ещё 1 комментарий
0

Обработка YUV лучше всего демонстрируется в файле APLEAGLView.m этого примера приложения:

https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLEAGLView_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLEAGLView_m-DontLinkElementID_6

Правильные настройки яркости и контрастности, чтобы поддерживать их соотношение пропорционально друг другу, демонстрируются в файле Shader.fsh по адресу:

https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_Shaders_Shader_fsh.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_Shaders_Shader_fsh-DontLinkElementID_9

Если вам нужна помощь в обмене кодом, я могу помочь. Пока же, используя заданное пользователем значение порога яркости, корректируемая яркостью плоскость Y вычисляется следующим образом:

Y '= (Y - (16/255)) * lumaThreshold;

Ещё вопросы

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