2012-05-21 3 views
1

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

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

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

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

Thanx за любую помощь.

ответ

2

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

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

Например - псевдо-код если вы работаете с 8bits канала:

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

thanx Andres для яркой/контрастной информации. Способ получения значения y работает хорошо, это правильный способ вернуть y правильно (нужна маска?): Yuv420sp [yp] = (байт) ((0xff & y) +16); – andrej

+0

Привет, поэтому эта часть кода: yuv420sp [yp] = (byte) ((0xff & y) +16) неверна (изображение просто зеленое), пожалуйста, может ли кто-нибудь предложить, как правильно вернуть значения в YUV ? – andrej

+0

Для контраста, умножая на такой же показатель, как и ваш 1.10, все становится ярче, и вам нужно сделать яркие вещи ярче и темнее. Вместо этого я бы умножился бы от центрального значения: если значения от 0 до 255, используйте 'luma [y] = (luma [y] -128) * 1.10 + 128'. –

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

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

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

Смежные вопросы