2009-10-19 5 views
0

Je suis en train de changer une partie d'une image avec une autre image je ne pouvais pas trouver la fonction de fusion donc je produire juste que je peux modifier les valeurs rgb de la partie que je veux changer avec l'autre images valeurs RVB est-il possibleModifier les valeurs RVB

Merci pour les suggestions

Répondre

3

Si par changement vous dire remplacer, alors vous pouvez utiliser le ROI image (région d'intérêt) fonctions à directement remplacer une zone rectangulaire de votre image d'origine avec une région rectangulaire d'une autre image très efficacement. Supposons que votre image d'origine a été stockée dans A et que vous souhaitiez en changer une partie (une zone rectangulaire) en utilisant les pixels d'une image B.

MISE À JOUR: Voici le code en C

/**** C ****/ 

// Acquire Image A and B (here as an example, I'm reading from disk) 
IplImage* A = cvLoadImage("image_A.jpg"); 
IplImage* B = cvLoadImage("image_B.jpg"); 

// Set the region-of-interest (ROI) for the two images 
// such that only the ROI of A and B will be handled 
cvSetImageROI(A,cvRect(200,200,128,128)); 
cvSetImageROI(B,cvRect(0,0,128,128)); 

// Copy the ROI in B to the ROI in A 
cvCopy(B,A); 

// Reset the ROI (now the entire image will be handled) 
cvResetImageROI(A); 
cvResetImageROI(B); 

// Display A 
cvNamedWindow("Modified A"); 
cvShowImage("Modified A",A); 
cvWaitKey(); 

// Release the images 
cvReleaseImage(&A); 
cvReleaseImage(&B); 

En utilisant OpenCV 2.0:

// C++ // 

// Images A and B have already been loaded ..... 

// Region in image A starting from (100,100) of width 200 and height 200 
Rect RegionA(100,100,200,200); 
// Region in image B starting from (50,50) of width 200 and height 200 
Rect RegionB(50,50,200,200); 

// No copying, just a reference to the ROI of the image 
Mat A_ROI(A,RegionA); 
Mar B_ROI(B,RegionB); 
// Copy all the pixels in RegionB in B to RegionA to A 
B.copyTo(A); 
+0

hmmm merci mais pouvez-vous écrire un code C je ne suis pas bon à C++ j'ai appris que la copie de cvSetImageROI qui a spécifié rectangulaire à une autre image j'ai entendu la fonction de ROI elle-même la première fois. comme je l'ai sous-entendu vos commentaires près du il fera juste ce que je cherche – eomer

+0

Ok, le code C est en hausse – Jacob

+0

merci jacob fonctionne parfait – eomer

0

vous pouvez essayer quelque chose comme ceci:

CvScalar s = cvGet2D(original_cvimage, x, y); // get the (x,y) pixel value 
cvSet2D(new_cvimage, x, y, s); // set the (x,y) pixel value 
+0

je ne comprends pas ce que fait-il peut vous expliquer – eomer

+0

cvGet2D retourne un objet CvScalar qui représente un pixel. Si vous dites: s = cvGet2D (original_cvimage, 0, 0), il renverra les valeurs RVB pour pixel (0,0). s [0] = valeur bleue, s [1] = vert et s [2] = rouge. Mais ce n'est pas votre préoccupation. Tout ce que vous devez savoir, c'est qu'après avoir appelé s = cvGet2D (original_cvimage, x, y); , s tiendra la valeur du pixel pour 1 pixel de votre image originale. En appelant cvSet2D (new_cvimage, x, y, s); vous chargez 1 pixel de votre image originale dans la nouvelle image. Vous devez donc ajouter une boucle imbriquée pour parcourir tous les pixels de votre image. – anyone

+0

Ça va être ** très lent **. – Jacob

Questions connexes