2016-08-29 5 views
0

У меня есть сегментирующие маски с индексированными цветами. К сожалению, на краях объектов есть (цветной) шум. При переходе от одной цветовой области к другой существуют небольшие области пикселей в разных цветах, разделяющие две цветовые области (вызванные преобразованием прозрачных пикселей по краям).Как удалить/переназначить небольшие пиксельные области (по краям) из цветных изображений? (MATLAB)

See image: Segmentation with Noise

Я хочу, чтобы удалить этот шум (с MATLAB), назначая цвет одной из соседних крупных регионов. Не имеет значения, какой из них - главное, чтобы удалить небольшие участки. Можно предположить, что небольшие области ЛЮБОГО цвета могут быть удалены таким образом (переназначить в соседнюю большую область).

В случае двоичного изображения, я мог бы использовать bwareaopen (предлагается в этом Q & A: Remove small chunks of labels in an image). Преобразование изображения в двоичное изображение для каждого цвета может быть обходным путем, однако это дорого (для многих цветов) и оставляет вопрос о переназначении открытым. Надеюсь, есть более элегантные способы сделать это.

+0

Как вы назначаете индексы в первую очередь? Вы не должны использовать интерполяцию или что-либо, что приведет к недействительным индексам. Возможно, сделайте шаг назад и исправьте задание, а не пост-обработку результата. – Suever

+0

Это отличная идея, и если бы я сам сделал маркировку, я бы избегал прозрачности при сегментировании изображений. Так как теперь мне нужно работать с указанными метками, это не вариант:/ – Honeybear

+0

Итак, у вас есть индексированные значения '[1, 2, 3]' например? – Suever

ответ

1

Проверьте следующее:

  • Преобразование RGB в индексированные изображения.
  • Применение медианного фильтра на индексированной карте.
  • Преобразовать обратно в RGB

RGB = imread('GylzKm.png'); 

%Convert RGB to indexed image with 4 levels 
[X, map] = rgb2ind(RGB, 4); 

%Apply median filter on 4 levels images 
X = medfilt2(X, [5, 5]); 

%Convert indexed image back to RGB. 
J = ind2rgb(X, map); 

figure;imshow(J); 

Черная граница немного проблематично.

enter image description here

+0

Спасибо - это работает как шарм! Поскольку у меня уже были индексированные изображения, первый и последний шаги были устаревшими. Я мог бы удалить артефакты как черную рамку, показанную на картинке, уменьшив размер ядра ('X = medfilt2 (X, [3, 3]);'). Единственной оставшейся проблемой были коричневые пиксели между черными и красными областями. Если я заменил все пиксели, индексированные как черные на белый, тоже будет удален коричневый шум. Интересно, почему, поскольку индексированные цвета не должны заботиться о коричневом виде, близком к сочетанию черного/красного. Возможно, проблема связана с порядком индекса. (черный = 0, коричневый = 1, зеленый = 2, красный = 4, белый = 6, ...) – Honeybear

+0

Я был supersized Я мог найти такое простое решение. Идея использования 'medfilt2' пришла быстро, но осознание того, что я могу использовать' rgb2ind' для получения ближайшего цвета, было удачей ... Как вы решили его без преобразования в RGB? Вы использовали 'imapprox' или просто' medfilt2'? – Rotem

+0

Я просто использовал 'medfilt2', поскольку, как уже упоминалось ранее, у меня уже были индексированные цветные изображения (поэтому применение' rgb2ind', вероятно, не сработает или ничего не изменит). Так или иначе: мне нравится идея medfilt2. Еще раз спасибо :) – Honeybear