Le sujet de cet article est en fait la conversion de l'espace colorimétrique de l'image. À l'aide d'un programme de sélection de couleurs, l'utilisation de la fonction de conversion des couleurs dans OpenCV et certaines précautions sont expliquées.
Espace colorimétrique RVB : RVB utilise la méthode de mélange additif des couleurs, car il décrit le rapport des différentes « lumières » pour produire des couleurs. Dès l’obscurité, la lumière se superpose continuellement pour produire de la couleur. RVB décrit les valeurs de la lumière rouge, verte et bleue. Le stockage d'images numériques utilise généralement le mode RVB. Il convient de noter que l'ordre de stockage des trois canaux dans OpenCV est BGR.
HSV, HSI : Ces deux formats de couleurs sont définis en fonction de la distinction faite par l'œil humain entre les couleurs, où H (teinte) représente la teinte, S (saturation) représente la saturation et V (valeur) représente la luminosité, I ( intensité) représente la luminosité.
Espace Lab : Les changements uniformes dans le modèle correspondent à des changements uniformes dans la couleur perçue, nous pouvons donc imaginer Lab comme un point dans l'espace colorimétrique. Plus les points adjacents sont proches, plus ils sont proches les uns des autres. Plus l'espace du laboratoire est proche, plus il est souvent utilisé pour mesurer la similitude de deux couleurs.
Pour plus d'informations sur l'espace colorimétrique, veuillez vous référer à : http://en.wikipedia.org/wiki/Color_space
Dans. OpenCV La conversion des couleurs de l'image s'effectue via la fonction cvtColor. cvtColor est définie dans le fichier d'en-tête opencv2/imgproc/imgproc.hpp. Son interface C est la suivante :
void cvtColor. ( InputArray src, OutputArray dst, int code, int dstCn=0 )
src : image d'entrée.
dst : Image de sortie.
code : Type de conversion de couleur, tel que : CV_BGR2Lab, CV_BGR2HSV, CV_HSV2BGR, CV_BGR2RGB.
dstCn : Le numéro de canal de l'image de sortie. Si la valeur par défaut est 0, cela signifie le nombre de canaux de l'image d'entrée.
Convertir l'image de BGR en Lab : cvtColor(image,image,CV_BGR2Lab)
Nous définissons d'abord une classe colorDetect :
class colorDetect{private: int minDist; //minium acceptable distance Vec3b target;//target color; Mat result; //the resultpublic: colorDetect(); void SetMinDistance(int dist); void SetTargetColor(uchar red,uchar green,uchar blue); void SetTargetColor(Vec3b color); //set the target color Mat process(const Mat& image); //main process};
Mat colorDetect::process(const Mat& image) { Mat ImageLab=image.clone(); result.create(image.rows,image.cols,CV_8U); //将image转换为Lab格式存储在ImageLab中 cvtColor(image,ImageLab,CV_BGR2Lab); //将目标颜色由BGR转换为Lab Mat temp(1,1,CV_8UC3); temp.at<Vec3b>(0,0)=target;//创建了一张1*1的临时图像并用目标颜色填充 cvtColor(temp,temp,CV_BGR2Lab); target=temp.at<Vec3b>(0,0);//再从临时图像的Lab格式中取出目标颜色 // 创建处理用的迭代器 Mat_<Vec3b>::iterator it=ImageLab.begin<Vec3b>(); Mat_<Vec3b>::iterator itend=ImageLab.end<Vec3b>(); Mat_<uchar>::iterator itout=result.begin<uchar>(); while(it!=itend) { //两个颜色值之间距离的计算 int dist=static_cast<int>(norm<int,3>(Vec3i((*it)[0]-target[0], (*it)[1]-target[1],(*it)[2]-target[2]))); if(dist<minDist) (*itout)=255; else (*itout)=0; it++; itout++; } return result; }
cdet.SetMinDistance(50);