Table des matières PDFMathematica

Rétroprojection d'un histogramme

1. Introduction

Les histogrammes ont été introduits dans Niveaux de gris et couleurs.

Considérons par exemple un histogramme de niveaux de gris d'une image monochrome. Si x désigne un niveau de gris quelconque, l'histogramme fournit (pour un échantillonnage de x) le nombre f(x) de pixels de l'image ayant ce niveau de gris. La rétroprojection d'un histogramme sur une image est la transformation qui remplace le niveau x de chaque point de l'image par la valeur f(x).

La rétroprojection est surtout utilisée avec les histogrammes 2D Hue-Sat, dans le but d'effectuer une reconnaissance d'objets à partir de leur couleur.

2. Rétroprojection d'un histogramme HS

Un histogramme HS permet de connaitre le nombre de pixels f(h,s) ayant une valeur h de HUE et s de SAT. La rétroprojection consiste à remplacer chaque pixel de l'image par la valeur f(h,s).

Comme exemple, on considère une image en comportant des objets de couleurs voisines. On cherche à identifier les objets ayant la même couleur qu'un objet particulier. La même technique pourra être utilisée pour suivre un objet dans une séquence d'images vidéo.

On commence par lire l'image puis on sélectionne un rectangle qui délimite une couleur particulière :

Needs['CV`'];
CVOpen[];
img=CVLoadImage['puzzle.png',CVLoadImageUnchanged];
s=CVGetSize[img];
edit=CVJImageEditor['puzzle',True];
CVJShowImage[edit,img];
rectList=CVJGetPixelRectangleList[edit];
rect=Floor[rectList[[1]]]
            
{66, 150, 16, 28}
img2=CVCreateImage[s,IplDepth8U,3];
CVConvertScale[img,img2,1.0,0.0];
CVRectangle[img2,rect,{255,0,0},1];
            
Image[CVGetImageArray[img2,1,-1]]
imgA.pngimgA.pdf

L'image BGR est convertie en HSV puis les trois couches sont séparées :

hsv=CVCreateImage[s,IplDepth8U,3];
CVCvtColor[img,hsv,CVBGR2HSV];
hue = CVCreateImage[s,IplDepth8U,1];
sat = CVCreateImage[s,IplDepth8U,1];
val = CVCreateImage[s,IplDepth8U,1];
CVSplit[hsv,hue,sat,val,0];
            

La zone rectangulaire sélectionnée ci-dessus permet de définir une zone d'intérêt :

CVSetImageROI[hue,rect];
CVSetImageROI[sat,rect];
            

On calcule l'histogramme HS de cette zone d'intérêt, avec un échantillonnage de 20x20 :

histHS=CVCreateHist[{20,20},CVHistArray,{{0,180},{0,255}},1];
CVCalcHist[{hue,sat},histHS,0,0];
histImg=CVGetHueSatHistImage[histHS,10];
            
Image[CVGetImageArray[histImg,1,-1]]
imgB.pngimgB.pdf

Voyons les valeurs minimale et maximale de l'histogramme :

minmax=CVGetMinMaxHistValue[histHS]
{{0., 0., 0.}, {110., 1., 14.}}

La valeur maximale est ici inférieure à 256. D'une manière générale, il faudra normaliser l'histogramme avant d'effectuer la rétroprojection sur une image 8 bits :

CVConvertHistScale[histHS,256.0/minmax[[2,1]],0.0];

On désactive les ROI puis on créée une image monochrome pour acceuillir la rétroprojection :

CVResetImageROI[hue];
CVResetImageROI[sat];
back=CVCreateImage[s,IplDepth8U,1];
            

Enfin la rétroprojection de l'histogramme sur l'image initiale :

CVCalcBackProject[{hue,sat},back,histHS];
Image[CVGetImageArray[back,1,-1]]
imgC.pngimgC.pdf
CVClose[];
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.