Introduction au traitement des images et à la stéréo-vision

Retroprojection de l'histogramme

Fondamental

La rétroprojection d'un histogramme h sur une image est la transformation qui remplace la valeur xde chaque pixel de l'image par la valeur h(x).

Exemple

3 étapes :

  1. On sélectionne une zone n'incluant qu'un seul bonbon (un rouge),

  2. on construit l'histogramme de cette zone

  3. on projette la valeur de l'histogramme sur l'image originale

MéthodeCode en python

Dans cet exemple on utilise que le plan vert pour calculer l'histogramme

1
import numpy as np
2
import cv2 as cv
3
img = cv.imread('c:/temp/fruits.jpg',cv.IMREAD_COLOR)
4
#selection d'un morceau de l'orange
5
orange = img[300:380,150:220]
6
cv.imshow('fruits',img)
7
cv.imshow('orange',orange)
8
# histogramme du plan 1 =vert
9
c=[1]
10
# 32 zones dans l'histogramme
11
r=[32]
12
# valeurs des piels entre 0 et 256 (exclus)
13
rc=[  0, 256]
14
#histogramme du morcea sélectionné
15
roihist = cv.calcHist([orange],c, None, r, rc )
16
# normalisation de l'histogramme entre 0 et 255
17
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
18
# projection de l'histogramme sur l'image originale
19
dst = cv.calcBackProject([img],c,roihist,rc,1)
20
moyenne=cv.mean(dst)
21
print(" Moyenne image ",moyenne[0])
22
ret,thresh = cv.threshold(dst,128,255,0)
23
nbPixels255=cv.countNonZero(thresh)
24
print(" Nombre de pixels retenus : ",nbPixels255)
25
thresh = cv.merge((thresh,thresh,thresh))
26
27
cv.imshow('dst',dst)
28
cv.imshow('res',thresh)
29
cv.waitKey(0)
30
cv.destroyAllWindows()
31

La zone choisie est entourée en noir. L'image au centre est la probabilité qu'un pixel ressemble à la zone entourée, et l'image de droite représente les pixels dont la probabilité est supérieure à 0.5

On modifie le programme précédent pour travailler sur deux plans (bleu et vert)

1
c=[0, 1]
2
r=[32 ,32]
3
rc=[  0, 256,0, 256]

Le résultat s'améliore :

ComplémentChangement d'espace couleur

On peut améliorer le code en travaillant sur l'espace couleur HSV :

1
import cv2 as cv
2
img1 = cv.imread('c:/temp/fruits.jpg',cv.IMREAD_COLOR)
3
img=cv.cvtColor(img1,cv.COLOR_BGR2HSV)
4
#selection d'un morceau de l'orange
5
orange = img[300:380,150:220]
6
cv.imshow('fruits',img1)
7
cv.imshow('orange',orange)
8
# selection des plans H et S
9
c=[0, 1]
10
r=[32 ,32]
11
rc=[  0, 256,0, 256]
12
13
#histogramme du morceau sélectionné
14
roihist = cv.calcHist([orange],c, None, r, rc )
15
# normalisation de l'histogramme entre 0 et 255
16
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
17
# projection de l'histogramme sur l'image originale
18
dst = cv.calcBackProject([img],c,roihist,rc,1)
19
moyenne=cv.mean(dst)
20
print(" Moyenne image ",moyenne[0])
21
ret,thresh = cv.threshold(dst,128,255,0)
22
thresh = cv.merge((thresh,thresh,thresh))
23
nbPixels255=cv.countNonZero(thresh)
24
print(" Nombre de pixels retenus : ",nbPixels255)
25
26
cv.imshow('dst',dst)
27
cv.imshow('res',thresh)
28
cv.waitKey(0)
29
cv.destroyAllWindows()
30

Résultat dans l'espace Hue Saturation

Remarque

On pourrait essayer avec trois plans mais il y a un bug en cours de correction...

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimerRéalisé avec Scenari (nouvelle fenêtre) modèle documentaire TechnOpale