2016-08-29 2 views
0

J'ai des masques de segmentation avec des couleurs indexées. Malheureusement, il y a du bruit (coloré) sur les bords des objets. Lors de la transition d'une région de couleur à la suivante, il existe de petites régions de pixels de différentes couleurs, séparant les deux régions de couleur (provoquées par la conversion de pixels transparents sur les bords).Comment puis-je supprimer/réattribuer de petites zones de pixels (sur les bords) à partir d'images en couleur? (MATLAB)

See image: Segmentation with Noise

Je veux supprimer ce bruit (avec Matlab) en attribuant une couleur d'une des grandes régions voisines. Peu importe, la chose principale est d'enlever les petites zones. On peut supposer que de petites régions de n'importe quelle couleur peuvent être supprimées de cette manière (réaffectation à la grande région voisine). Dans le cas d'une image binaire, je pourrais utiliser bwareaopen (suggéré dans ce Q & A: Remove small chunks of labels in an image). Convertir l'image en une image binaire pour chaque couleur pourrait être une solution de contournement, mais cela est coûteux (pour beaucoup de couleurs) et laisse la question de réaffectation ouverte. J'espère qu'il y a des façons plus élégantes de le faire.

+0

Comment avez-vous assignez les index en premier lieu? Vous ne devriez pas utiliser l'interpolation ou tout ce qui produira des indices invalides. Peut-être prendre un peu de recul et de fixer l'affectation plutôt que de post-traitement du résultat. – Suever

+0

C'est une excellente idée, et si j'avais fait l'étiquetage moi-même, j'aurais évité la transparence lors de la segmentation des images. Puisque je dois travailler maintenant avec les étiquettes données, ce n'est pas une option cependant:/ – Honeybear

+0

Donc avez-vous des valeurs indexées '[1, 2, 3]' par exemple? – Suever

Répondre

1

Vérifiez les points suivants:

  • Convertir RVB à l'image indexée.
  • Appliquer le filtre médian sur la carte indexée.
  • reconvertir en 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); 

La frontière noire est un peu problématique.

enter image description here

+0

Merci - cela fonctionne comme un charme! Comme j'avais déjà des images indexées, la première et dernière étape était obsolète. Je pourrais enlever des artefacts comme la frontière noire montrée dans votre image en diminuant la taille de noyau ('X = medfilt2 (X, [3, 3]);'). Le seul problème restant était des pixels bruns entre les zones noires et rouges. Si je remplace tous les pixels indexés par du blanc, le bruit marron est également supprimé. Vous vous demandez pourquoi, car les couleurs indexées ne devraient pas se préoccuper du fait que Brown soit proche d'un mélange de noir/rouge. Peut-être que le problème est avec l'ordre de l'index. (noir = 0, marron = 1, vert = 2, rouge = 4, blanc = 6, ...) – Honeybear

+0

J'étais surdimensionné Je pouvais trouver une solution aussi simple. L'idée d'utiliser 'medfilt2' est arrivée rapidement, mais en réalisant que je peux utiliser' rgb2ind' pour obtenir la couleur la plus proche, j'ai eu de la chance ... Comment l'avez-vous résolu sans convertir en RGB? Avez-vous utilisé 'imapprox' ou juste' medfilt2'? – Rotem

+0

Je viens d'utiliser 'medfilt2', puisque comme je l'ai déjà mentionné j'avais déjà des images couleur indexées (donc l'application' rgb2ind' ne fonctionnerait probablement pas ou ne changerait rien). En tout cas: j'aime l'idée de medfilt2. Merci encore :) – Honeybear