Documente Academic
Documente Profesional
Documente Cultură
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)
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.
cvMerge(imB,imG,imR,NULL,imColor)
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.
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);
// 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
3
4
5
Dacă permutați canalele de culoare ale unei imagini gri aproape perfect, acesta nu se schimbă prea mult.