Проблема рисования многоугольника на кластерах данных в MATLAB

У меня есть некоторые точки данных, которые я разделил на несколько кластеров с некоторыми алгоритмами кластеризации, как показано на рисунке ниже: (может потребоваться некоторое время для отображения изображения) http://www.freeimagehosting.net/uploads/05a807bc42.png

Каждый цвет представляет отдельный кластер. Мне нужно нарисовать многоугольники вокруг каждого кластера. По этой причине я использую convhull. Но, как вы можете видеть, многоугольник для красного кластера очень большой и покрывает множество областей, а это не то, что я ищу. Мне нужно нарисовать линии (ploygons) точно вокруг моих наборов данных. Например, на картинке выше я хочу, чтобы многоугольник был нарисован точно так же (и вокруг), что и красный кластер с тремя ветвями. Другими словами, в этом случае мне нужен многоугольник с 3 ветвями, чтобы покрыть мои красные кластеры, а не тот большой многоугольник, который покрывает всю область. Кто-нибудь может мне с этим помочь? Обратите внимание, что решение должно быть общим, поскольку кластеры будут меняться при каждом запуске алгоритма, поэтому оно должно быть общим.


person Hossein    schedule 01.06.2010    source источник
comment
duplicate stackoverflow.com/questions/2944872/   -  person Alex Gordon    schedule 02.06.2010
comment
Извините, но это совсем другое ....   -  person Hossein    schedule 02.06.2010


Ответы (2)


Я не уверен, что это полностью конкретный вопрос. Я вижу, что такие варианты по этому вопросу возникают довольно часто.

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

Какой правильный корпус вокруг этого? Это просто выпуклый корпус? Это внутренний треугольник с выходящими из него тремя шпорами? Имеет ли значение, каковы относительные размеры треугольников? Стоит ли тогда указывать этот параметр?

person MatlabDoug    schedule 01.06.2010

Если ваши кластеры очень компактные, вы можете попробовать следующее:

  1. Создайте сетку, скажем, с интервалом 0,1.
  2. Установите для каждого пикселя в сетке значение 1, если его покрывает хотя бы одна точка данных, установите для пикселя значение 0, если нет точки данных, покрывающей пиксель.
  3. Возможно, вам придется запустить imclose на своей маске, чтобы заполнить маленькие дырочки внутри, которые не были окрашены из-за чистой неудачи.
  4. Извлеките пиксели границы, например, bwperim. Это контур многоугольника, который вы ищете.
person Jonas    schedule 03.06.2010