Подписывайся на наш Телеграм канал, задавай вопросы по роботам, делись своими схемами,
помогай другим собирать роботов и набирайся опыта!
t.me/servodroid
Иногда нужно выделить на изображении объект определённого цвета, для этого подходить RBG фильтр. Если разбить цветное изображение на несколько каналов и над каждым из них проделать пороговое преобразование, то если применить к получившимся изображениям логическую операцию И, получим черно-белое изображение, где белым цветом будут выделены объекты выбранного цвета. Звучит сложно и не понятно, но на примере всё будет проще и нагляднее. Цвет, который нужно выделить задается 6-ю параметрами: Rmin, Rmax, Gmin, Gmax, Bmin, Bmax при помощи ползунков (trackBar). Для того, чтобы удобнее было применять фильтр, напишем отдельный метод:
Code
private Image<Gray, Byte> RGBFilter(Image<Bgr,Byte> input, Gray Rmin, Gray Rmax, Gray Gmin, Gray Gmax, Gray Bmin, Gray Bmax, int dialate) { Image<Gray, Byte> result = new Image<Gray, byte>(input.Width, input.Height); Image<Gray, byte>[] chanels = input.Split(); chanels[0] = chanels[0].InRange(Rmin, Rmax); chanels[1] = chanels[1].InRange(Gmin, Gmax); chanels[2] = chanels[2].InRange(Bmin, Bmax); result = chanels[0].And(chanels[1]); result = result.And(chanels[2]); result = result.Dilate(dialate); return result; }
Если передать этому методу исходное цветное изображение, параметры Rmin....Gmax и параметр dialate, который отвечает за степень размытия изображения на выходе, то получим то самое, черно-белое изображение, на котором белым цветом будут выделены объекты заданного цвета. Давайте попробуем выделить на фото со светофором жёлтый фонарь:
Видите, как здорово? Такой фильтр применен в программе для поиска цветных маяков.
К теме приложен проект этой короткой программы с коментариями. Проект разбит на 2 архива. Открывать проект при помощи Visual C# Express 2008 или при помощи Visual Studio 2008 Pro, можно открыть и любой другой студией вообщем-то. Скачать проект.