Как обрабатывать зеркальные блики в фильтре хроматического ключа?

Я работаю над фильтром хроматического ключа (зеленый экран) для Android, используя opengl; единственная разница в том, что я пытаюсь заменить не только зеленый фон, но и любой цвет, переданный пользователем. Мне удалось заменить цвет, но проблема в том, что он также заменяет цвет объекта, интенсивность света которого очень высока.

Может ли кто-нибудь помочь мне уменьшить световые блики от текстуры, чтобы мой фильтр работал должным образом?

Или любой эталонный фильтр зеленого экрана, который отлично работает.

Все будет приветствоваться.

введите здесь описание изображения

РЕДАКТИРОВАТЬ: я добавил скриншот, чтобы объяснить ситуацию. Здесь я попытался заменить красный фон этими облаками, это сработало для всей области, кроме той, в которой есть блики света. Я могу преодолеть это, увеличив значение допуска, но тогда это заставит заменить некоторые желтые пиксели объекта.


person Adarsh Sharma    schedule 05.10.2016    source источник
comment
Не могли бы вы дать образец неотредактированного изображения? Также может быть полезна ваша текущая формула состава.   -  person Yakov Galka    schedule 05.10.2016
comment
@ybungalobill, пожалуйста, найдите изображение по этой ссылке. ; переменная highp vec2 textureCoordinate2; равномерный плавающий порог чувствительности; равномерный vec3 colorToReplace; void main () { vec4 color = texture2D (inputImageTexture, textureCoordinate); vec4 background = texture2D(inputImageTexture2, textureCoordinate2); vec3 diff = color.xyz - colorToReplace; if(dot(diff, diff) ‹ thresholdSensitivity) { color = texture2D(inputImageTexture2, textureCoordinate2); } gl_FragColor = цвет; };   -  person Adarsh Sharma    schedule 05.10.2016
comment
@ybungalobill, вы можете проверить эту ссылку для справки. Это объяснит, что я делаю для Android shadertoy.com/view/XsfGzn   -  person Adarsh Sharma    schedule 05.10.2016
comment
@AdarshSharma: Добавляйте подобные вещи в свой вопрос, а не в комментарий.   -  person Nicol Bolas    schedule 05.10.2016
comment
@NicolBolas Хорошо. Теперь вы можете мне помочь?   -  person Adarsh Sharma    schedule 05.10.2016
comment
@AdarshSharma Когда я говорил подобные вещи, я имел в виду код, который вы написали в комментарии, а не ваш вопрос.   -  person Nicol Bolas    schedule 05.10.2016
comment
@NicolBolas Я понял. Вам не нужно описывать это снова и снова. Вы здесь только для того, чтобы провести время?   -  person Adarsh Sharma    schedule 05.10.2016
comment
@AdarshSharma: очевидно, ваш расчет проверяет цвет RGB, а не цветность, как следует. Попробуйте извлечь обе цветности и сравнить их.   -  person Yakov Galka    schedule 06.10.2016


Ответы (1)


Алгоритмически будет сложно просто сопоставить цвета RGB.

Первое, что нужно отметить, это то, что в вашем случае вы просто смотрите на некоторую форму значения, чувствительного к яркости, а не на чистое значение цветности. Яркие пиксели всегда будут иметь сильный отклик в каналах R, G и B, поэтому простое пороговое значение здесь не даст надежного решения.

Если бы вы извлекли значение цветности, не зависящее от яркости (как это сделала бы кодировка YUV), вы могли бы выделить «красноту», «зеленость» и «голубизну» независимо от яркости цвета.

Тем не менее, это все еще будет иметь крайние случаи. Например, что произойдет, если ваша бутылка будет красной или на ней будет красная этикетка? Чтобы решить эту проблему, вам нужна некоторая форма извлечения геометрических элементов (например, обнаружение края сорбеля по изображению), а затем замена цвета только в определенной определенной области.

Ничто из этого не тривиально — точное обнаружение и распознавание объектов очень сложно и все еще активно исследуется (например, круиз-контроль Tesla пытается обнаруживать и избегать объектов во время вождения).

person solidpixel    schedule 06.10.2016