Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
Есть картинка, на ней изображены круглые объекты.
Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая.
Картинку можно считать черно-белой.
Фон светло серый, объекты темно-серые.
Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах.
Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
Здравствуйте, Wasilij, Вы писали:
W>Здравствуйте, Все!
W>Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
W>Есть картинка, на ней изображены круглые объекты. W>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая. W>Картинку можно считать черно-белой. W>Фон светло серый, объекты темно-серые. W>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах. W>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
W>Заранее благодарю!
Ну задачка, даже в такой постановке не тривиальная
Соответственно все её решения — достаточно приближённые.
Например, можно пойти таким путем:
1) Выделить контуры на изображении (последовательности точек перепада яркости), векторизовать их.
2) к координатам выделенных контуров применить приеобразование, которое даст из круга прямую (желательно, что бы по её коэффициентам определелялись однозначно радиус и координаты центра исходного круга).
3) Сообственно, по количеству прямых (а алгоритмы их обнаружения достсточно известны) в новых координатах можно судить о количестве кругов у тебя на картинке.
Преобразование, приводящее из круга в прямую существует, но я его сейчас не помню.
Определение того, что все точки лежат на одной прямой — считаеш k и b по двум точкам — проверяешь, удовлетворяют ли остальные точки этому уравнению.
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте, Micker, Вы писали:
M>Здравствуйте, Wasilij, Вы писали:
W>>Здравствуйте, Все!
W>>Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
W>>Есть картинка, на ней изображены круглые объекты. W>>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая. W>>Картинку можно считать черно-белой. W>>Фон светло серый, объекты темно-серые. W>>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах. W>>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
W>>Заранее благодарю!
M>Ну задачка, даже в такой постановке не тривиальная M>Соответственно все её решения — достаточно приближённые.
M>Например, можно пойти таким путем: M>1) Выделить контуры на изображении (последовательности точек перепада яркости), векторизовать их.
А как быть при разрыве границы круга?
Ведь тогда получиться несколько контуров для одного объекта.
W>А как быть при разрыве границы круга? W>Ведь тогда получиться несколько контуров для одного объекта.
Судя по всему, тут не достаточно найти просто контуры объектов. Может рассмотреть подход, когда будут выделяться именно области с яркостью пикселов больше заданной? Такие алгоритмы обязательно есть в инете, ибо задача распознавания образов стара и мат. аппарат уже должен быть придуман
Здравствуйте, Wasilij, Вы писали:
W>Есть картинка, на ней изображены круглые объекты. W>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая. W>Картинку можно считать черно-белой. W>Фон светло серый, объекты темно-серые. W>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах. W>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
О! Моя дипломная работа!
Я делал так. Оператор может накладывать фильтры на изображение (типа, яркость не меньше стольки-то) и глазом смотрит, чтобы осталось только то, что нужно. Потом жманает кнопку "Сосчитать".
Программа пытается выделить круги (в моем случае — овалы) в том, что осталось.
Сначала все "сжимается" на N пикселей (N задает оператор). Все, что осталось и подходит по размерам считается овалами.
W>А как быть при разрыве границы круга? W>Ведь тогда получиться несколько контуров для одного объекта.
ответ на этот вопрос зависит от двух факторов:
1) условия исходной задачи (например, контуры достаточно резкие — разрывов быть не может).
2) от выбранного преобразования (п.2 моего алгоритма)
Так, в координатах (радиус, центральная_точка) одному кругу, должна соответствовать одна точка.
Если круги только примерно круглые, то каждому из них будет соответствовать область точек
Как провести границу между такими облаками — думаю, тоже зависит от физики задачи.
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте, Tan4ik, Вы писали:
T>Программа пытается выделить круги (в моем случае — овалы) в том, что осталось. T>Сначала все "сжимается" на N пикселей (N задает оператор). Все, что осталось и подходит по размерам считается овалами.
Андрей, а не могли бы вы поподробнее осветить этот момент: что делается с сжатым изображением? и почему там не останется квадратиков, например?
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте, Micker, Вы писали:
T>>Программа пытается выделить круги (в моем случае — овалы) в том, что осталось. T>>Сначала все "сжимается" на N пикселей (N задает оператор). Все, что осталось и подходит по размерам считается овалами.
M>Андрей, а не могли бы вы поподробнее осветить этот момент: что делается с сжатым изображением? и почему там не останется квадратиков, например?
А у меня на картинке ничего кроме овалов и мусора быть не могло. Поэтому все приблизительно подходящее по размерам считалось овалом.
Здравствуйте, Wasilij, Вы писали:
W>Здравствуйте, Все!
W>Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
W>Есть картинка, на ней изображены круглые объекты.
Хорошо W>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая.
Это еще лучше W>Картинку можно считать черно-белой.
Нужно приводить к черно-белой W>Фон светло серый, объекты темно-серые. W>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах.
Это мелочи W>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
Будем считать.
Для удаления вкраплений (импульсных помех) эффективна медианная фильтрация. Подбираем фильтр с апертурой, превосходящей наибольшую помеху — и вперед, с песнями. Побочным действием медианного фильтра, как известно, является некоторое уменьшение числа уровней квантования изображения, сегментация по уровню. Далее, для корректировки контуров (сглаживания границ) применяем операции открытия/закрытия изображений (открытие — последовательное применение фильтра типа медианного, где берется 1 элемент отсортированной последовательности (минимум) и фильтра, где берется последний элемент (максимум), закрытие — наоборот, или вообще наоборот, не суть важно. Если надо расширить светлые области, забив темные — одно, если наоборот — другое ). Кстати, можно обойтись только ими, без медианной фильтрации. Подобрав соответствующие размер и форму окна фильтров открытия/закрытия можно удалять неровности/вкрапления различного размера и придавать итоговым фигурам требуемую форму (напр, перегнать круги в квадраты)
Дальше бинаризуем изображение.
Ну а поиск цельных (без вкраплений) кругов/квадратов фиксированного размера на чистом фоне — совсем уж просто. Если еще не надоело, и это расскажу W>Заранее благодарю!
_>Для удаления вкраплений (импульсных помех) эффективна медианная фильтрация. Подбираем фильтр с апертурой, превосходящей наибольшую помеху — и вперед, с песнями.
А как подобрать такой фильтр и как его наложить, если не сложно... ?
_>Побочным действием медианного фильтра, как известно, является некоторое уменьшение числа уровней квантования изображения, сегментация по уровню. Далее, для корректировки контуров (сглаживания границ) применяем операции открытия/закрытия изображений (открытие — последовательное применение фильтра типа медианного, где берется 1 элемент отсортированной последовательности (минимум) и фильтра, где берется последний элемент (максимум), закрытие — наоборот, или вообще наоборот, не суть важно. Если надо расширить светлые области, забив темные — одно, если наоборот — другое ). Кстати, можно обойтись только ими, без медианной фильтрации. Подобрав соответствующие размер и форму окна фильтров открытия/закрытия можно удалять неровности/вкрапления различного размера и придавать итоговым фигурам требуемую форму (напр, перегнать круги в квадраты)
Похоже то что нужно, только опять таки где взять эти фильтры? Это матрицы и их надо как то учитывать в картинке, или как?
_>Дальше бинаризуем изображение.
То есть светло-серое делаем белым, а темно-серое — черным?
_>Ну а поиск цельных (без вкраплений) кругов/квадратов фиксированного размера на чистом фоне — совсем уж просто. Если еще не надоело, и это расскажу.
Нет не надоело. Можно попдробнее...
Поищи в яндексе ссылки по теории линейной/нелинейной фильтрации. Медианный фильтр — самый известный нелинейный.
Кратко, на примере.
Есть изображение, с яркостями:
Как применим? пройдемся по всему изображению, "накладывая" маску фильтра, и если в маске для точки 1 — помещая ее во временный массив (маска 3х3 без дырок -Ю массив в 9 элементов). Для определенности не будем обрабатывать крайние точки в изображении ( мы и так их записали нулями)
Тогда для верхней-левой единицы получаем массив
Те мы убрали 3 импульсных помехи (2 девятки и нолик внутри) и внесли небольшие искажения (почикали углы). Кстати, если к полученному изображению вновь применить тот же медианный фильтр, то оно не изменится -Ю по достижении определенной конфигурации изображение при медианной фильтрации стабилизируется, в отличии от линейного фильтра, например, скользящего среднего
Более подробно — в яндексе и книжках, эксперименты при желании в матлабе или сам прогу простенькую напиши.
Думаю, понятно. что для удаления большей по площади помехи требуется филтьтр с большей апертурой. А при большей апертуре уже можно аппроксимировать окрестность точки не только квадратом, но и более округлым многоугольником.
Очевидно, что из отсортированного массива можно брать не только медиану, но и любой другой элемент. в тч первый (минимальный) или последний (максимальный), что полезно для расширения областей фона/объектов на изображении -Ю получаем операции открытия/закрытия W>Здравствуйте, ivan_k, Вы писали:
W>А как подобрать такой фильтр и как его наложить, если не сложно... ?
Если влом читать теорию, то можно эмпирически
_>>Побочным действием медианного фильтра, как известно, является некоторое уменьшение числа уровней квантования изображения, сегментация по уровню. Далее, для корректировки контуров (сглаживания границ) применяем операции открытия/закрытия изображений (открытие — последовательное применение фильтра типа медианного, где берется 1 элемент отсортированной последовательности (минимум) и фильтра, где берется последний элемент (максимум), закрытие — наоборот, или вообще наоборот, не суть важно. Если надо расширить светлые области, забив темные — одно, если наоборот — другое ). Кстати, можно обойтись только ими, без медианной фильтрации. Подобрав соответствующие размер и форму окна фильтров открытия/закрытия можно удалять неровности/вкрапления различного размера и придавать итоговым фигурам требуемую форму (напр, перегнать круги в квадраты)
W>Похоже то что нужно, только опять таки где взять эти фильтры? Это матрицы и их надо как то учитывать в картинке, или как?
_>>Дальше бинаризуем изображение. W>То есть светло-серое делаем белым, а темно-серое — черным?
Если у изображения 256 уровней яркости (8 бит), то, к примеру, все, что темнее 127 — черное, что светлее — белое. В автоматическом режиме при бимодальном распределении гистограммы можно определеять положение ее минимума и резать по нему.
W>Нет не надоело. Можно попдробнее...
Можно по Фурье-спектру, можно (на хорошем изображении) линейным кореллятором, а можно и по-нанайски. Отдаю даром:
Проще всего с кругами. тк они инвариантны к повороту:
Зная его радиус, определяешь сторону вписанного квадрата и берешь шаг сканирования изображения по строкам меньше этой стороны.
Выбираешь строки из изображения с вычисленным ранее шагом.
сканируешь эти строки (типа, справа налево. или наоборот ), отмечая в них участки сигнала, протяженностью не менее вписанного квадрата и не более радиуса круга. тк выбран правильный шаг сканирования, то мы не пропустим ни одного объекта, возможно только появление дубликатов. проверяешь, что через центр отобранных подозрительных отрезков вертикально также проходит отрезок сигнала, примерно равный радиусу искомого круга. Если так -Ю считаем кругом (можно и более строгие проверки устроить). Его центр нам известен. По координатам центра удаляем дубликаты.
Работает на хороших изображениях (а мы его сделаем-таки хорошим ), где круги примерно одного известного радиуса и не перекрываются.
Вроде все
А можно еще раз про векторизацию? Те с того момента, когда выделили контуры кругов из бинарного изображения. Как теперь соответствующие пиксели соединить ломаными?
Здравствуйте, gok, Вы писали:
gok>Здравствуйте, ivan_k, Вы писали:
_>>Вроде все
gok> gok>А можно еще раз про векторизацию? Те с того момента, когда выделили контуры кругов из бинарного изображения. Как теперь соответствующие пиксели соединить ломаными?
А их не надо соединять ломанными, это уже будут не котнуры а пятна т.е. закрашенные непрерывные области.
Здравствуйте, Wasilij, Вы писали:
W>Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
Делал такое на курсовой . Монеты на столе распознавала. Правда, сыровато получилось, но довести до ума можно, наверное. Если интересно — могу заслать.
Кроме того, по этому делу есть куча статей. Метод, которым я пользовался, называется преобразование Хока (Hough transform). Выделяет окружности (линии) на изображении. Статьи можно даже в сети найти.
Здравствуйте, Wasilij, Вы писали:
W>Здравствуйте, Все!
W>Кто-нибудь может подсказать решение вот такой задачи или где можно почитать...
W>Есть картинка, на ней изображены круглые объекты. W>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая. W>Картинку можно считать черно-белой. W>Фон светло серый, объекты темно-серые. W>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах. W>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
W>Заранее благодарю!
Перечитал все топики, все что предлагали даже близко не катит.
На подобных задачах сижу 2 года, и относятся они к машинному зрению.
Преобразование Хоха (Хафа) тоже туфта, тк тормозное
неточное и самое главное очень чувствительно к шуму
годится только для выделения идеальных объектов.
На самом деле все решается очень просто (буквально в 10 строк)
По идее необходимо минимизировать функционал по параметрам a,b,r
F(a,b,r)=Sqrt(Sum(Rho(P[i],C(a,b,r))^2,i=1..N))
C(a,b,r) — окружность (a,b — центр, r — радиус)
P[i] — i-я точка
N — число точек
Rho(P,C) — некоторая мера 'расстояния' м/у точкой и окружностью
Для большинства приложений подойдет обычный лоренциан
Rho — должна быстро стремиться к 1 при удалении точки от окружности
и равняться 0 если точка лежит на дуге.
Если мининимизить в лоб (GaussNewton LevMar и тп)
то встрянешь в первом приличном локальном минимуме
и ничто тебе не поможет, тк при сотне точек у этого
функционала порядка 2^100 локальных минимумов
однако можно схитрить:
Алгоритм: (на вход подается N двумерных точек P[i]=(x[i],y[i]))
1. Выбираешь 3 точки (случайно и равномерно)
2. Расчитываешь параметры окружности a,b,r
продящей ч/з эти 3 точки
3. Считаешь и запоминаешь Cost=F(a,b,r)
4. Повторяешь 1,2,3 K — раз и возвращаеш a,b,r с минимальным Cost.
Для выбора K есть куча умных формул, но они нафиг не нужны если
только не в реалтайме видеопоток обрабатываешь.
Ставишь K=256 и эта штучка найдет разглядит окружность даже
по 30% кривым и порванным ошметкам дуги при наличии 80% шума
(даже человеку трудно разглядеть)
Достоинства:
Абсолютная устойчивость к шуму.
Годится для любых кривых/поверхностей/объектов до которых можно посчитать расстояние
и найти параметры по небольшому числу точек.
Простота реализации (даже доп. массивы не нужны).
Самый универсальный и естественный способ.
Недостатков НЕТ!
Если нужно много объектов найти используй Sliding Window
Если нужно найти круг используй Canny
Здравствуйте, Tan4ik, Вы писали:
T>Здравствуйте, Wasilij, Вы писали:
W>>Есть картинка, на ней изображены круглые объекты. W>>Объекты примерно одинаковых размеров +/- 20%, форма приблизительно круглая. W>>Картинку можно считать черно-белой. W>>Фон светло серый, объекты темно-серые. W>>Закраска объектов неоднородная, то есть имеются светлые вкрапления и разрывы в границах. W>>Нужно подсчитать количество круглых объектов и выделить их как-нибудь на картинке.
T>О! Моя дипломная работа! T>Я делал так. Оператор может накладывать фильтры на изображение (типа, яркость не меньше стольки-то) и глазом смотрит, чтобы осталось только то, что нужно. Потом жманает кнопку "Сосчитать". T>Программа пытается выделить круги (в моем случае — овалы) в том, что осталось. T>Сначала все "сжимается" на N пикселей (N задает оператор). Все, что осталось и подходит по размерам считается овалами.
Извини за грубость, но если ты на матфаке учился, то это позор, а не дипломная работа
Почему? см ниже.
Сорри, что встреваю... но заинтересовало!
_>На самом деле все решается очень просто (буквально в 10 строк) _>По идее необходимо минимизировать функционал по параметрам a,b,r _>F(a,b,r)=Sqrt(Sum(Rho(P[i],C(a,b,r))^2,i=1..N)) _>C(a,b,r) — окружность (a,b — центр, r — радиус) _>P[i] — i-я точка _>N — число точек _>Rho(P,C) — некоторая мера 'расстояния' м/у точкой и окружностью _>Для большинства приложений подойдет обычный лоренциан _>Rho — должна быстро стремиться к 1 при удалении точки от окружности _>и равняться 0 если точка лежит на дуге.
_>Алгоритм: (на вход подается N двумерных точек P[i]=(x[i],y[i]))
_>1. Выбираешь 3 точки (случайно и равномерно) _>2. Расчитываешь параметры окружности a,b,r _> продящей ч/з эти 3 точки _>3. Считаешь и запоминаешь Cost=F(a,b,r)
_>4. Повторяешь 1,2,3 K — раз и возвращаеш a,b,r с минимальным Cost.
А это в случае 1ой окружности на фотке или можно сколько угодно?
И почему, если 256 раз случайно выбрать (a,b,r), то среди них найдется искомая окружность?
------------- _>Если нужно много объектов найти используй Sliding Window
После минимизации или куда это прикручивать? _>Если нужно найти круг используй Canny
К чему эти две строчки? (сорри)
-------------
Здравствуйте, piAnd, Вы писали:
A>Здравствуйте, unreg_flex, Вы писали:
A>Сорри, что встреваю... но заинтересовало!
_>>На самом деле все решается очень просто (буквально в 10 строк) _>>По идее необходимо минимизировать функционал по параметрам a,b,r _>>F(a,b,r)=Sqrt(Sum(Rho(P[i],C(a,b,r))^2,i=1..N)) _>>C(a,b,r) — окружность (a,b — центр, r — радиус) _>>P[i] — i-я точка _>>N — число точек _>>Rho(P,C) — некоторая мера 'расстояния' м/у точкой и окружностью _>>Для большинства приложений подойдет обычный лоренциан _>>Rho — должна быстро стремиться к 1 при удалении точки от окружности _>>и равняться 0 если точка лежит на дуге.
_>>Алгоритм: (на вход подается N двумерных точек P[i]=(x[i],y[i]))
_>>1. Выбираешь 3 точки (случайно и равномерно) _>>2. Расчитываешь параметры окружности a,b,r _>> продящей ч/з эти 3 точки _>>3. Считаешь и запоминаешь Cost=F(a,b,r)
_>>4. Повторяешь 1,2,3 K — раз и возвращаеш a,b,r с минимальным Cost. A>А это в случае 1ой окружности на фотке или можно сколько угодно? A>И почему, если 256 раз случайно выбрать (a,b,r), то среди них найдется искомая окружность?
A>------------- _>>Если нужно много объектов найти используй Sliding Window A>После минимизации или куда это прикручивать? _>>Если нужно найти круг используй Canny A>К чему эти две строчки? (сорри) A>-------------
Для множественного выделения заводишь апертуру размера к примеру 4*[макс. радиус]
и применяешь 1,2,3 к каждому положению апертуры, естественно нуно задать
максимальный Cost и все сэмплы Cost которых больше максимального выбрасывать.
Canny упомянул чтоб не спрашивали откуда исходные точки брать