views:

312

answers:

2

hi

i am trying to change a part of an image with another image i couldn't find the merging function so i just occur that can i change the rgb values of the part i want to change with the other images rgb values is it possible

thanks for suggestions

A: 

You could try something like this:

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
anyone
i dont understand what does it do can you explain
eomer
cvGet2D returns a CvScalar object which represents a pixel. If you say: s = cvGet2D(original_cvimage, 0, 0), it'll return the RGB values for pixel (0,0). s[0] = bluevalue, s[1] = green and s[2] = red. But that's non of your concern. All you need to know is that after you've called s = cvGet2D(original_cvimage, x, y); , s will hold the pixel value for 1 pixel of your original image. By calling cvSet2D(new_cvimage, x, y, s); you're loading 1 pixel from your original image in the new image. So you need to add a nested loop to go through all the pixels in your image.
anyone
That's going to be **very slow**.
Jacob
Yes it is, but I read this thread: http://stackoverflow.com/questions/1571683/opencv-image-on-imageand was under the impression that the OP didn't want to use cvSetImageROI and cvCopy
anyone
Ah ok, I get it now.
Jacob
+2  A: 

If by change you mean replace, then you can use the image ROI (region of interest) functions to directly replace a rectangular region of your original image with a rectangular region from another image very efficiently.

Suppose your original image was stored in A and you want to change a part of it (a rectangular region) using pixels from an image B.

UPDATE: Here's the code in 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);

Using 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);
Jacob
hmmm thanks but can you write a C code i'm not good at C++i learned that cvSetImageROI copy that specified rectangular to another image i heard ROI function itself first time. as i undertand your comments near the it will just do what i am looking for
eomer
Ok, the C code is up
Jacob
thanks jacob works perfect
eomer