Я работаю над этой проблемой в течение некоторого времени с небольшими многообещающими результатами. Я пытаюсь разделить изображение на связанные области одинакового цвета. (в основном разбивают список всех пикселей на несколько групп (каждая группа, содержащая координаты пикселов, принадлежащих ей и имеющих одинаковый цвет).
Например: http://unsplash.com/photos/SoC1ex6sI4w/
На этом изображении темные облака наверху, вероятно, попадут в одну группу. Некоторые из серой скалы на горе в другой, а некоторые из оранжевой травы в другой. Снег будет другим - красный рюкзак - и т.д.
Я пытаюсь разработать алгоритм, который будет как точным, так и эффективным (его нужно запускать в случае ms на аппаратном уровне среднего класса ноутбука)
Ниже я попытался:
Используя алгоритм, основанный на подключенном компоненте, пройти через каждый пиксель сверху слева, просматривая каждую строку пикселей слева направо (и сравнивая текущий пиксель с верхним пикселем и левым пикселем). Используя формулу разности цветов CIEDE2000, если пиксель в верхней или левой части находился в определенном диапазоне, он будет считаться "похожим" и частью группы.
Этот вид работы - но проблема в том, что он полагается на области цвета, имеющие острые края - если любые группы цветов связаны мягким градиентом, он будет перемещаться по этому градиенту и продолжать "присоединяться" к пикселям в качестве разницы между сравниваемые отдельные пиксели достаточно малы, чтобы считаться "похожими".
Чтобы попытаться исправить это, я решил установить каждый посещенный пиксельный цвет в цвет большинства "похожих" соседних пикселей (верхний или левый). Если нет одинаковых пикселей, они сохраняют оригинальный цвет. Это несколько устраняет проблему более размытых границ или мягких краев, потому что первый цвет новой группы будет "переноситься" по мере продвижения алгоритма, и в итоге разница между этим цветом и текущим сравниваемым цветом будет превышать "сходство" threashold и больше не будут частью этой группы.
Надеюсь, это имеет смысл. Проблема в том, что ни один из этих вариантов не работает. На изображении выше возвращаемое - это не чистые группы, а шумные фрагментированные группы, которые не то, что я ищу.
Я не ищу код специально, но больше идей относительно того, как алгоритм может быть структурирован для успешной борьбы с этой проблемой. У кого-нибудь есть идеи об этом?
Спасибо!