2013-06-17 2 views
1

je l'image suivante:techniques de traitement d'image pour se démarquer du ruban blanc sur le sol avec OpenCV

Original

Je voudrais obtenir une image seuillée où seule la bande est blanche, et fond tout est noir .. jusqu'à présent, je l'ai essayé ceci:

Mat image = Highgui.imread("C:/bezier/0.JPG"); 
Mat byn = new Mat(); 
Imgproc.cvtColor(image, byn, Imgproc.COLOR_BGR2GRAY); 
Mat thresh = new Mat(); 

// apply filters 
Imgproc.blur(byn, byn, new Size(2, 2)); 
Imgproc.threshold(byn, thresh, 0, 255, Imgproc.THRESH_BINARY+Imgproc.THRESH_OTSU); 
Imgproc.erode(thresh, thresh, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4, 4))); 

Mais j'obtenir cette image, qui est loin de ce que je veux:

Thresholded image

La bande serait toujours de la même couleur (blanc) et de la même largeur (environ 2cm), une idée? Merci

+0

Le contraste (médiocre) et la translucidité du ruban seront-ils les mêmes dans le cadre de la production? – fvu

+0

Nope @fvu, En production je pense que je vais utiliser une bande rétroréfléchissante pour booster le contraste et peut-être avec une caméra IR (moins probable) –

Répondre

2

Voyons voir ce que vous savez:

  • La bande a un contraste plus faible
  • La bande est plus léger que l'arrière-plan

Si vous connaissez l'échelle de l'image, vous pouvez exécuter des seuils adaptatifs sur deux niveaux. Disons que la largeur de la bande est de 100 pixels: fenêtre

  1. rejeter un pixel ayant une luminosité à l'extérieur de +/- x à partir de la luminosité moyenne dans le 50x50 (peut-être plus petit, mais pas plus) qui l'entoure et Rejeter un pixel dont la luminosité est inférieure à y + la luminosité moyenne dans la fenêtre 100x100 (peut-être plus grande, mais pas plus petite) qui l'entoure.

Vous devriez également expérimenter un peu, en essayant la moyenne et la médiane comme définitions de «moyenne» pour chaque seuil.

A partir de là, vous devriez avoir une image beaucoup mieux définie, et vous pouvez supprimer tous, mais le plus grand contour (probablement la piste)

1

Je pense que vous ne prenez pas parti du fait que la bande est blanc (et le sol est dans une nuance de brun).

Plutôt que de convertir en niveaux de gris avec cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY) essayez d'utiliser une opération personnalisée qui pénalise la saturation ... Peut-être quelque chose comme la conversion en HSV et laissez G = V * (1-S).

Questions connexes