Maison > interface Web > Tutoriel PS > La route vers la croissance d'OpenCV (3) : imiter l'outil baguette magique dans PhotoShop

La route vers la croissance d'OpenCV (3) : imiter l'outil baguette magique dans PhotoShop

高洛峰
Libérer: 2017-02-20 09:09:25
original
1607 Les gens l'ont consulté

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.

1. Plusieurs espaces colorimétriques courants :

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

2 Conversion de l'espace colorimétrique dans OpenCV

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)

3. Programme de baguette magique simple

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};
Copier après la connexion
Le minDist est le seuil que nous avons défini pour limiter la distance entre deux couleurs, qui équivaut au seuil de l'outil baguette magique dans PhotoShop.

target est la couleur cible, qui est équivalente à la couleur de la graine. result est le résultat obtenu par le traitement de stockage.

Le processus est le programme de traitement principal. Examinons le contenu du processus.

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;
}
Copier après la connexion


Il y a deux points qui nécessitent une attention particulière dans le programme :

1 Après avoir converti l'image en espace Lab, la couleur cible également. doit être converti, l’approche consiste à créer une image temporaire.

2. La fonction norm est utilisée pour déterminer la distance entre deux couleurs. Son fonctionnement est norm(v). où v est un vecteur de faible dimension. Dans le programme, il s'agit d'une quantité tridimensionnelle appropriée, qui résulte de la soustraction de deux valeurs de couleur.

La chose à laquelle il convient de réfléchir est de savoir si Vec3i((*it)[0]-target[0],(*it)[1]-target[1],(*it)[2]- Quoi à propos du remplacement de target[2]) par Vec3i((*it)-target) ? La réponse est non, car (*it)-target restreindra automatiquement le type de résultat de soustraction pendant l'opération réelle.

Après avoir défini la couleur cible et le seuil comme ceci, nous pouvons obtenir un exemple d'effet :

cdet.SetTargetColor(150,150,150);

cdet.SetMinDistance(50);

La route vers la croissance dOpenCV (3) : imiter loutil baguette magique dans PhotoShop

Pour plus de chemin de croissance OpenCV (3) : imitant l'outil baguette magique dans PhotoShop, veuillez faire attention au site Web PHP chinois pour les articles connexes !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal