• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Выделение контрастных объектов на картинке в C# или C++.

  • Автор темы TriXel_01
  • Дата начала
T

TriXel_01

Дана картинка с аэрофотосъёмки. Задача, пометить объекты, отличающихся от других.
Например дом в лесу, костёр в поле или дым.
С чего вообще начать?

помогите, куда копать вообще?
нет никакой информации.
как вообще составить блок схему?
 
R

rrrFer

Вообще, анализ изображений - это сложно. Но, как ты знаешь, любую сложную задачу разделяют на более простые.

Я думаю, твою задачу надо свести к поиску объектов на черно-белом (или типа того) изображении.

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

Каждый объект изображения тебе надо кодировать каким-то числом. Берешь первый пиксель, присваиваешь ему код. Берешь следующий пиксель, смотришь пиксели, которым присвоены коды, вокруг него, если цвета похожи (сам думай как это определить) - то текущему пикселю присваиваешь код код похожего. Если не похожи - то присваиваешь новый код. Если текущий пиксель похож на несколько пикселей вокруг себя, значит он объединяет несколько областей - присваиваешь ему код любой из области, а остальные области "перекрашиваешь" с этим же кодом.

Это первый этап, в результате которого ты, грубо, говоря, повысишь контрастность (насколько повысишь - зависит только от того, что ты будешь понимать под "похожими писелами"). Ну а дальше - те е шаги, что при анализе черно-белого изображения - удаление шумов (маленьких объектов), разделение объектов на несколько (если они соединены только узкой "перемычкой" - при распознавании символов рукописного текста это важно) и т.п.

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

TriXel_01

Вообще, анализ изображений - это сложно. Но, как ты знаешь, любую сложную задачу разделяют на более простые.

Я думаю, твою задачу надо свести к поиску объектов на черно-белом (или типа того) изображении.

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

Каждый объект изображения тебе надо кодировать каким-то числом. Берешь первый пиксель, присваиваешь ему код. Берешь следующий пиксель, смотришь пиксели, которым присвоены коды, вокруг него, если цвета похожи (сам думай как это определить) - то текущему пикселю присваиваешь код код похожего. Если не похожи - то присваиваешь новый код. Если текущий пиксель похож на несколько пикселей вокруг себя, значит он объединяет несколько областей - присваиваешь ему код любой из области, а остальные области "перекрашиваешь" с этим же кодом.

Это первый этап, в результате которого ты, грубо, говоря, повысишь контрастность (насколько повысишь - зависит только от того, что ты будешь понимать под "похожими писелами"). Ну а дальше - те е шаги, что при анализе черно-белого изображения - удаление шумов (маленьких объектов), разделение объектов на несколько (если они соединены только узкой "перемычкой" - при распознавании символов рукописного текста это важно) и т.п.

Ну а потом, тебе надо сопоставлять объекты изображения с эталонными объектами (образ домика и т.п.). Я бы посмотрел как это делается при распознавании текста, там есть прикольные алгоритмы.
а где это лучше делать, в С++ или в С# ?
где проще?
 
R

rrrFer

а где это лучше делать, в С++ или в С# ?
где проще?
Разницы нет. Изображение - это массив с пикселями. Обрабатывать его можно хоть в паскале. Нет разницы ни в простоте, ни в эффективности.
Однако, если вам нужно чтобы эта штука быстро работала - я думаю, вам надо будет ее распараллеливать. Это опять же, можно делать на чем угодно, но я бы использовать OpenMP на компьютерах с общей памятью и MPI - на компьютерах с распределенной памятью. Реализации этих библиотек, впрочем, есть для разных языков - и для того же паскаля даже.
 
T

TriXel_01

Разницы нет. Изображение - это массив с пикселями. Обрабатывать его можно хоть в паскале. Нет разницы ни в простоте, ни в эффективности.
Однако, если вам нужно чтобы эта штука быстро работала - я думаю, вам надо будет ее распараллеливать. Это опять же, можно делать на чем угодно, но я бы использовать OpenMP на компьютерах с общей памятью и MPI - на компьютерах с распределенной памятью. Реализации этих библиотек, впрочем, есть для разных языков - и для того же паскаля даже.
ну что ж, спасибо!)
буду пробовать)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!