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 :
Méthode : Code 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]
Complément : Changement 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
Remarque :
On pourrait essayer avec trois plans mais il y a un bug en cours de correction...