Как отделить объект от фона по цвету

Дмитрий Маштаков
  В Фотошопе такая возможность есть, называется она «фоновый ластик» - указываем на цвет фона, и специальной кисточкой возим по рисунку, удаляем фон такого цвета в тех местах, где он есть. Особенно это удобно, чтобы делать прогалы между ветвями или в листве дерева, сквозь которые просвечивает небо или желтеющие окрестные поля.
  Делается это с понятной целью - вырезать дерево из картинки и пересадить его, скажем, на асфальтированные улицы своего города и таким образом как бы озеленить их. ))

  Ну, у меня есть свой собственный редактор, и я захотел сделать в нём то же самое. Тут интересен сам принцип. А он очень простой, о чём и рассказываю.

  Вы знаете, что цвет каждого пикселя картинки представляет собой длинное число, содержащее три компоненты цвета. О четвёртой компоненте - прозрачности, мы не говорим, но эту прозрачность можно изобразить, условившись, что прозрачным будет считаться пиксель, например, белого цвета. Тогда полученную картинку с белыми прогалами в листве можно будет наложить на любой задний фон в обычной программе Paint.

  Как я уже упомянул, в программе Фотошоп имеется так называемый «фоновый ластик». А я меня есть кисть «Fill», выполняющая ту же роль.
  В нормальном своём состоянии кнопка «Fill» не окрашена в жёлтый цвет и не имеет свойств кисти. Она действует в полном соответствии своему названию – кликаем по диагональным углам прямоугольную область, и после клика на «Fill» прямоугольник закрашивается в нужный цвет.

  Но если мы кликнем по «Fill» правой кнопкой мыши, то «Fill» окрасится в жёлтый цвет, и кнопка эта организует широкую кисть, которая тоже будет закрашивать всё, что мы захотим. Правда будет она закрашивать пиксели выборочно, краска будет ложиться только на пиксели, имеющие тот же цвет, что и пиксель, с которого закраска началась. То есть кисть «Fill» будет выполнять заливку.
  Если же мы, оставив «Fill» жёлтой, перейдём в опцию рисования <а>, тогда кисть «Fill» будет вполне себе рисовать, создавая немного зернистый след. След будет голубым, если мы кликом правой кнопки считаем цвет неба. Проведя кистью несколько раз, мы создадим более плотный след, в нём зернистость будет видна только по краям.

  И совсем необычный режим мы получим, если установим на кнопке активного цвета знак решётки - # (значок устанавливается кликом по кнопке).
  В отсутствии опции <а> кисть «Fill» будет дискриминировать цвет.
  Что это значит?

  В RGB составляющих цвета будут оставаться только старшие биты, остальные биты полагаются равными нулю, и этим цветом осуществляется окрашивание. Естественно, что цвет на картинке при этом темнеет, но самое главное – области картинки, закрашенные сходным цветом, становятся окрашенными совершенно одинаково, и, следовательно, их теперь легко можно идентифицировать и перекрасить в белый цвет фона. А это как раз то, что нам нужно.

  Как именно будут дискриминироваться биты, зависит от цифр, выставленных на трёх кнопках численного задания цвета. Они находятся на верхней панели, справа от кнопки активного цвета. На иллюстрации видно, что там выставлены цифры 444, это значит, что в компонентах BGR (обратите внимание, последовательность цветов в программе показывается в другом порядке) останется по одному старшему биту. Изображение потемнеет, и вы можете видеть его в правом нижнем углу иллюстрации.

Это самая грубая дискриминация цвета. Тем не менее, выставив цифры 444, поставив опцию рисования <а>, взяв кликом правой кнопки мыши цвет голубого неба и установив решётку на кнопке цвета, мы вполне успешно отделим ветви дерева от фона, перекрашивая фон в белый цвет. И это видно в средней части иллюстрации.
  Дискриминация цифрами 666 оставляет по два старших бита в каждой компоненте, а дискриминация числом 777 оставит по три старших бита. Эти примеры также показаны на иллюстрации. Зон с примерно одинаковым цветом в этом случае оказывается много, и приходится назначать несколько другие оттенки голубого и забеливать каждую зону отдельно.

  Это более трудоёмкая работа, но в некоторых случаях она оправдана.
  На иллюстрации вы можете видеть, что структура из тонких серых веточек хорошо сохранена при дискриминации 466, тогда как при дискриминации 444 она практически исчезла.
  Я сравнивал работу своей программы с работой Фотошопа, показанной на этом видео - http://youtu.be/rMzhtmF2ZPY  и нашёл, что моя программа работает замечательно.

  Итак, я рассказал вам о том, как метод дискриминации цвета позволяет отделять объект от фона. Метод этот весьма эффективен и допускает тонкие настройки. Он прост, удобен в использовании и приводит к хорошим результатам.

__________
17.07.2021

Описанная опция кисти «Fill» сравнительно новая - я постепенно совершенствую программу, стараясь сделать её более эффективной и расширить область её применения.