Sunteți pe pagina 1din 6

Laborator 6.

Importanța canalelor RGB


Scopul laboratorului: să învețe despre anatomia unei imagini color. O imagine colorată are trei tonuri de culoare,
roșu (R), verde (G) și albastru (B). Aceste canale de culoare sunt complet independente unele de altele, astfel încât
pot fi separate în trei imagini cu un singur canal. În sens invers, trei imagini cu un singur canal de culoare de aceeași
dimensiune pot fi, în principiu, asamblate într-o singură imagine cu un singur canal de culoare, dar trebuie doar să
decidem care dintre ele trebuie să fie roșie, care verde și care albastră.

OpenCV vă oferă posibilitatea de a descompune o imagine cu mai multe canale descrisă de o structură IplImage în
canale de culoare:

cvSplit(imColor,imB,imG,imR,NULL)

Parametrii declarației de mai sus:

imColor – imaginea color de intrare care urmează să fie divizată.

imB, imG, imR – canalele de culoare albastră, verde și roșie sunt obținute în aceste imagini cu un singur canal de
culoare.

NULL – cea de-a patra componentă de culoare ar trebui plasată aici, dar nu o avem, așa că specificăm un pointer nul.

În mod similar, puteți compune o imagine color din canale de culoare.

cvMerge(imB,imG,imR,NULL,imColor)

Parametrii la afirmația de mai sus:

imB, imG, imR – canalele de culoare albastră, verde și roșie sunt specificate în aceste imagini cu un singur canal
de culoare

NULL – am putea specifica a patra componentă de culoare cu acest parametru, dar nu avem nevoie de ea, așa că
vom specifica un pointer nul.

imColor – aici se obține imaginea color

Problemă: Să încarcăm o imagine color.

1. Produceți imagini color în care fiecare canal de culoare pe rând este înlocuit cu o constantă zero. În principiu,
există trei astfel de imagini.
2. Produceți imagini color în care câte două dintre cele trei canale de culoare sunt înlocuite de o constantă
zero. În principiu, există trei astfel de imagini.
3. Permutați canalele de culoare ale imaginii color. În principiu, există șase astfel de imagini, dintre care una
este cea originală. Compuneți o imagine din componentele BGR în care, de exemplu, datele roșii originale
sunt date ca fiind albastre, verdele este aplicat în loc de roșu și albastrul este aplicat în loc de verde.
4. Produceți imagini color în care una dintre componentele de culoare este înlocuită cu propriul său negativ. În
principiu, există trei astfel de imagini.
5. Realizați o imagine color în care componenta color Y este înlocuită cu propriul său negativ. Utilizați
codificarea YCrCb pentru aceasta, ca în cazul egalizării histogramei.

Imaginile rezultate sunt plasate într-un model de tip mozaic pe o imagine mai mare.

1
O posibilă rezolvare
// această funcție copiază imaginile mici în imaginea mare, este lansat de 18x ori în total
void showMyImage(IplImage* imBig, IplImage* im, int& index)
{
cvSetImageROI(imBig,cvRect((index%6)*(im->width),(index/6)*(im->height),im->width,im->height));
cvCopy(im,imBig);
cvResetImageROI(imBig);
cvShowImage("Ablak",imBig);
index = (index+1)%18;
cvWaitKey();
}

void laborator5()
{
int index = 0;
// încărcarea imaginii orininale care să nu aibă o mărime mai mare decât 300x300 pixeli
IplImage* imO = cvLoadImage("imIn1.jpg",1);
// creareaimaginii mari care este de 6x mai lată și de 3x ori mai înaltă decât imaginea de intrare
IplImage* imBig = cvCreateImage(cvSize(imO->width*6,imO->height*3),imO->depth,imO->nChannels);
// imaginea mare este colorată (se pot schimba valorile RGB față de cea date mai jos)
cvSet(imBig,cvScalar(128,128,255,0));
showMyImage(imBig,imO,index);
// imaginea modificată va fi în imRe, imRe = IMage REsult
IplImage* imRe = cvCloneImage(imO);
// aceasta este o imagine gri, pe care o utilizăm când vrem să nu folosim un canal de culoare
IplImage* imZ = cvCreateImage(cvGetSize(imO),imO->depth,1);
cvSet(imZ,cvScalar(0));

// imaginea originală o descompunem în trei imagini pentru cele trei canale de culori
IplImage* inCh[3];
// imaginea de ieșire o creăm din trei imagini gri
IplImage* outCh[3];
// o creăm imaginile declarate mai sus
for (int i=0; i<3; ++i)
{
inCh[i] = cvCloneImage(imZ);
outCh[i] = cvCloneImage(imZ);
}
// o descompunem imaginea în imagini gri, care conțin informația unei canale de culoare
cvSplit(imO,inCh[0],inCh[1],inCh[2],NULL);

// O creăm imaginea conform subproblemei 1


for (int i=0; i<3; ++i)
{
for (int j=0; j<3; ++j) cvCopy(inCh[j],outCh[j]);
// canalul de culoare i rămâne negru complet
cvCopy(imZ,outCh[i]);
cvMerge(outCh[0],outCh[1],outCh[2],NULL,imRe);
showMyImage(imBig,imRe,index);
}

// O creăm imaginea conform subproblemei 2


for (int i=0; i<3; ++i)
{
// minden színcsatorna fekete marad, csak az i-dik marad az eredeti
for (int j=0; j<3; ++j) cvCopy(imZ,outCh[j]);
cvCopy(inCh[i],outCh[i]);
cvMerge(outCh[0],outCh[1],outCh[2],NULL,imRe);
showMyImage(imBig,imRe,index);
}

// O creăm imaginea conform subproblemei 3


for (int i=0; i<3; ++i)
for (int j=0; j<3; ++j) if (j!=i)
{
int k = 3 - i - j;
// (i,j,k) egy permutáció
cvMerge(inCh[i],inCh[j],inCh[k],NULL,imRe);
showMyImage(imBig,imRe,index);
}

// O creăm imaginea conform subproblemei 4


for (int i=0; i<3; ++i)
{
for (int j=0; j<3; ++j) cvCopy(inCh[j],outCh[j]);
// o calculăm negativul unei canale de culori
cvNot(outCh[i],outCh[i]);
cvMerge(outCh[0],outCh[1],outCh[2],NULL,imRe);
2
showMyImage(imBig,imRe,index);
}

// O creăm imaginea conform subproblemei 5


cvCvtColor(imO,imRe,CV_BGR2YCrCb);
cvSplit(imRe,inCh[0],inCh[1],inCh[2],NULL);
cvNot(inCh[0],inCh[0]);
cvMerge(inCh[0],inCh[1],inCh[2],NULL,imRe);
cvCvtColor(imRe,imRe,CV_YCrCb2BGR);
showMyImage(imBig,imRe,index);

// ca ultima imagine o adaugăm negativul imaginii originale pe imaginea mare


cvNot(imO,imRe);
showMyImage(imBig,imRe,index);
cvSaveImage("eredmeny.jpg",imBig);

// eliberarea memoriei
cvReleaseImage(&imBig);
cvReleaseImage(&imO);
cvReleaseImage(&imRe);
cvReleaseImage(&imZ);
for (int i=0; i<3; ++i)
{
cvReleaseImage(&inCh[i]);
cvReleaseImage(&outCh[i]);
}
}

void main()
{
laborator5();
}

Rezultate

Probabil un grădinar va alege cu ușurință imaginea originală :)

3
4
5
Dacă permutați canalele de culoare ale unei imagini gri aproape perfect, acesta nu se schimbă prea mult.

S-ar putea să vă placă și