Комментарии 46
Класс! Решение буквально в 10 строк, демонстрирующее всю мощь данного математического пакета, на мой взгляд, незаменимого для науки инструмента.
P.S.: И спасибо, что напомнили недалекое прошлое, когда используя матлаб для расчётов и построения графиков, я написал нехилый диплом и поступил в аспирантуру. Прям руки зачесались поставить его вновь и применить его для решения одной старенькой, для меня, задачи.
P.S.: И спасибо, что напомнили недалекое прошлое, когда используя матлаб для расчётов и построения графиков, я написал нехилый диплом и поступил в аспирантуру. Прям руки зачесались поставить его вновь и применить его для решения одной старенькой, для меня, задачи.
+2
Не за что! Если я правильно понимаю, вы давно не открывали MATLAB — в таком случае он может удивить вас новыми вкусными плюшками, которые добавляются с каждой новой версией — они сейчас выходят два раза в год.
0
вы видимо с IDL не знакомы, раз говорите о незаменимости матлаба в научных делах:)
+1
Вот это уже TRUE. Я и рассчитывал увидеть алгоритмы цифры и прочее, а там были игры в фотошоп какие-то. Спасибо
0
Решение прекрасное. Есть мелкий баг — иногда детектится внешний контур, иногда внутренний; т.е. всегда есть ошибка в радиусе либо +delta, либо -delta.
Но вообще — супер.
Про bwboundaries я не знал.
Но вообще — супер.
Про bwboundaries я не знал.
0
Хорошая задачка, вообще. Я бы (наверное) после нахождения контуров пробежался бы по всей картинке спец. фильтром для поиска окружностей, ну или более обще — эллипсов. Для него разрывы в контуре не проблемы.
А потом искал бы пары вложенных окружностей с примерно общим центром и небольшим зазором, и усреднял бы их радиусы и центры.
Другой вариант — искать не границы хребтов вокруг кратеров, а выделять сами хребты (т.е. трансформация IM -> (IM- Lowpass::Im).) И тогда можно искать самую высокую точку на хребте и т.п.
Понятно, что можно построить совершенно устойчивое решение. Но для этого надо все-таки неделю-две повозиться.
А потом искал бы пары вложенных окружностей с примерно общим центром и небольшим зазором, и усреднял бы их радиусы и центры.
Другой вариант — искать не границы хребтов вокруг кратеров, а выделять сами хребты (т.е. трансформация IM -> (IM- Lowpass::Im).) И тогда можно искать самую высокую точку на хребте и т.п.
Понятно, что можно построить совершенно устойчивое решение. Но для этого надо все-таки неделю-две повозиться.
+2
Примерно над этим я сейчас, честно говоря, и работаю. Есть уже определённые положительные результаты, и я скоро собираюсь ими поделиться на Хабрахабре. Заодно покажу пару картинок, к которым подобные преобразоания неприменимы, т.к. объекты либо имеют слегка неправильную форму, либо нечеткие границы.
Вот, к примеру, изображение, на котором выбранный алгоритм преобразования работает не совсем так, как хотелось бы.
(картинкой вставить не даёт, поэтому ссылки...)
Исходное изображение. Результат.
Как можно заметить, часть форм не обнаруживается. Большая часть мелких частиц обнаруживается, но большие — нет. Т.к. важно статистическое распределение, то это критично. Вот пытаюсь сейчас разрешить эту проблемку…
Вот, к примеру, изображение, на котором выбранный алгоритм преобразования работает не совсем так, как хотелось бы.
(картинкой вставить не даёт, поэтому ссылки...)
Исходное изображение. Результат.
Как можно заметить, часть форм не обнаруживается. Большая часть мелких частиц обнаруживается, но большие — нет. Т.к. важно статистическое распределение, то это критично. Вот пытаюсь сейчас разрешить эту проблемку…
+1
Мда… попробуйте создать базу данных из 100 наиболее типчных колечек разных диамтеров, и посчитайте корреляцию с каждым из них по всей картинке.
Получится 100 картинок, отражающих вероятность что именно это колечко здесь расположено, в данной точке (x,y).
Threshold уровни должны быть разные у больших и маленьких колечек.
Во время свертки учитывайте только пиксели на границе и внутри колец, т.е. ядро свертки должно быть круглым а не квадратным.
Получится 100 картинок, отражающих вероятность что именно это колечко здесь расположено, в данной точке (x,y).
Threshold уровни должны быть разные у больших и маленьких колечек.
Во время свертки учитывайте только пиксели на границе и внутри колец, т.е. ядро свертки должно быть круглым а не квадратным.
+1
Перед этим, конечно, pre-processing:
1) convert to greyscale
2) убрать фоновый уровень
3) выровнять локальную контрастность (убрать градиент освещения и т.п.)
1) convert to greyscale
2) убрать фоновый уровень
3) выровнять локальную контрастность (убрать градиент освещения и т.п.)
0
И это, как я понимаю, изначально полагалось вручную обрабатывать? Жесть!
Еще подход — без перехода к оттенкам серого. Как нетрудно заметить, изображение состоит по сути из трех цветов — белого (внутри объектов), черного (границы объектов) и фиолетового (фон). Переводим изображение в цветовое простанство HSV — тон, насыщенность, яркость. Яркость нам не нужна, используем только информацию о цвете. Кластеризуем точки изображения в координатах Тон-Насыщенность методом К-средних по метрике Евклида, вот что получается.
Видны косяки, связанные с градиентом освещения — внизу изображение слишком светлое, а сверху-слева слишком темное. Но освещение, я так понимаю, можно настроить… Белым — наши объекты, заметьте даже очень мелкие выделились.
Такой метод можно использовать наравне с остальными и затем объединить результаты.
Еще подход — без перехода к оттенкам серого. Как нетрудно заметить, изображение состоит по сути из трех цветов — белого (внутри объектов), черного (границы объектов) и фиолетового (фон). Переводим изображение в цветовое простанство HSV — тон, насыщенность, яркость. Яркость нам не нужна, используем только информацию о цвете. Кластеризуем точки изображения в координатах Тон-Насыщенность методом К-средних по метрике Евклида, вот что получается.
Видны косяки, связанные с градиентом освещения — внизу изображение слишком светлое, а сверху-слева слишком темное. Но освещение, я так понимаю, можно настроить… Белым — наши объекты, заметьте даже очень мелкие выделились.
Такой метод можно использовать наравне с остальными и затем объединить результаты.
+1
Насчет того, что яркость нам не нужна — это Вы, я думаю, погорячились! :)
А белый цвет там результат overexposure, к сожалению. Так что никакой значимой информации он не добавляет.
Жалко, конечно. Признаюсь, я вначале тоже об этом думал…
А белый цвет там результат overexposure, к сожалению. Так что никакой значимой информации он не добавляет.
Жалко, конечно. Признаюсь, я вначале тоже об этом думал…
0
НЛО прилетело и опубликовало эту надпись здесь
Расскажите пожалуйста о каком спец фильтре идет речь? для поиска окружностей? Решаю такую же задачу, только в круге есть текстура. Контура из за этого слегка рвутся. И таким образом задачка не решается. Дилатация конечно соединяет рваные контуры, но контур становится толстым, и его сложно трассировать. Сейчас есть алгоритм трассировки контура когда у каждой точки контура не более двух соседей, если контур толще — то не ясно как его трассировать. Говорят есть алгоритм Suzuki85 для этого однако описания нормального в научной литературе не нашел.
0
НЛО прилетело и опубликовало эту надпись здесь
Снаружи — есть текстура, все что угодно, у меня тестовые примеры на столе, а стол весь из дерева с характерным рисунком. Детектор Канни первым этапом предполагает применение фильтра гаусса, текстура внутри очень сложная, может на самом деле все что угодно. В общем буду допытываться до автора предыдущей статьи, там мне больше идея с заливкой понравилась.
0
Толстые контуры можно скелетизировать алгоритмом Зонга-Суня (Zhang-Suen), или пустить по контуру «волну» и отслеживать её центр (где-то видел описание такого алгоритма, сейчас с ходу не вспомню, но могу найти).
0
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да, к сожалению стоимость высока… Но есть опенсорсный аналог — SciLab, работал в нем не очень много, поэтому сравнивать по функционалу не могу.
0
Лучшая реклама матлаба и антиреклама велосипедов.
>имперически
эмпирически, наверно.
>имперически
эмпирически, наверно.
0
Велосипеды тоже нужны. Все нужно.
Матлаб — сильное оружие, но если не понимать в точности, как каждая его функция работает, то далеко не уедешь. А если понимать, то по большому счету не важно в какой среде писать.
Хотя для разработки алгоритмов matlab супер удобный.
Матлаб — сильное оружие, но если не понимать в точности, как каждая его функция работает, то далеко не уедешь. А если понимать, то по большому счету не важно в какой среде писать.
Хотя для разработки алгоритмов matlab супер удобный.
+4
Спасибо, поправил.
0
Велосипед хорошо, катаюсь когда тепло.
0
> диляция
Вроде как «дилатация» будет правильней.
И, да, почему именно Канни? Тоже эмпирически?
Вроде как «дилатация» будет правильней.
И, да, почему именно Канни? Тоже эмпирически?
0
Судя по английской вики, диляция и дилатация — одно и то же. Я привык к термину 'диляция'.
Канни — эмпирически, время на исследование эффективности различных методов не тратил.
Канни — эмпирически, время на исследование эффективности различных методов не тратил.
0
Хорошая демонстрация возможностей Матлаба.
Интересно, на каких-нибудь opensource аналогах, том же SciLab или Octave, например, можно добиться такого же быстрого решения?
Интересно, на каких-нибудь opensource аналогах, том же SciLab или Octave, например, можно добиться такого же быстрого решения?
0
НЛО прилетело и опубликовало эту надпись здесь
LabVIEW Vision же есть :)
0
Здорово! Спасибо, что не поленились написать! Я всерьез задумался об использовании MATLAB'a… Я действительно потратил на порядок больше времени, но в него входило изучение нового языка и т.п.
Ещё раз спасибо!
Ещё раз спасибо!
+1
Ссылка в тему: www.tvoystart.ru/archive/work-13297/phase-15574/ :)
-2
Одна из актуальных и прикладных задач, которую я к сожалению лет 10 назад профакапил — определение «правильной круглости» колец Ньютона для тестирования зеркал лазерной сварки. Используются в автомобильной промышленности. Получалось что зеркала Российского производства выгодно дешевле, но немцев не убедило — главное для них было качество (что и надо было обеспечить) и высокая цена была заложена в стоимость мерседесов, бмв и прочих ауди.
0
Если знаешь как, то это можно сделать во многих математических пакетах. Например, в Mathematica:
SetDirectory[NotebookDirectory[]];
img = Import["kkk.jpg", "Graphics"];
grayimg = ImageAdjust[ColorConvert[img, "Grayscale"]] ;
bw = FillingTransform[EdgeDetect[grayimg, Method -> "Canny"]];
bw = Binarize[Blur[bw, 4]];
components = {#[[2, 2]], #[[2, 1]]} & /@ ComponentMeasurements[bw, {"EquivalentDiskRadius", "Centroid"}];
ImageDimensions[img]
Show[
img,
Graphics[{Red, Circle @@ #} & /@ components],
Graphics[Text[Style[NumberForm[#2, 3], 15, Yellow], #1 - (#2/Sqrt[2] + 6)] & @@ # & /@ components]
]
+3
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Детектирование округлостей на изображении средствами MATLAB