#include "cv.h" #include "highgui.h" #include "stdio.h" int main(int argc,char *argv[]) { IplImage* image1=0; IplImage* image2=0; IplImage* image3=0; image1=cvLoadImage("image1.bmp",1); if(!image1) { printf("could not load image1/n"); exit(0); } image2=cvLoadImage("image2.bmp",1); if(!image2) { printf("could not load image2/n"); exit(0); } //注意通道的不然的话要用其它函数转换见depthTest2 image3=cvCreateImage(cvGetSize(image1),image1->depth,image1->nChannels); //读取并输出图像的通道信息 int height=image1->height; int width=image1->width; int channels=image1->nChannels; int depth=image1->depth; printf("height1=M,width1=M,depth=%d,channels=%d/n",height,width,depth,channels); cvNamedWindow("image1",CV_WINDOW_AUTOSIZE); cvNamedWindow("image2",CV_WINDOW_AUTOSIZE); cvNamedWindow("image3",CV_WINDOW_AUTOSIZE); cvShowImage("image1",image1); cvShowImage("image2",image2); cvWaitKey(0); //对image1和image2的融合 //采用选取图像灰度较大值进行融合处理 int step=image1->widthStep/sizeof(uchar); uchar *data1=(uchar *)image1->imageData; uchar *data2=(uchar *)image2->imageData; uchar *data3=(uchar *)image3->imageData; // CvScalar s1,s2,s3; for(int i=0;i<height;i++) for(int j=0;j<width;j++) { for(int k=0;k<channels;k++) {//用间接访问方法// // s1=cvGet2D(image1,i,j); // s2=cvGet2D(image2,i,j); // if(s1.val[k]>=s2.val[k]) // s3.val[k]=s1.val[k]; // else // s3.val[k]=s2.val[k]; //指针直接访问方法 if(data1[i*step+j*channels+k]>=data2[i*step+j*channels+k]) data3[i*step+j*channels+k]=data1[i*step+j*channels+k]; else data3[i*step+j*channels+k]=data2[i*step+j*channels+k]; } //设置image3的像素值 // cvSet2D(image3,i,j,s3); } //显示融合后的窗口 cvShowImage("image3",image3); cvSaveImage("image.bmp",image3); cvWaitKey(0); //销毁窗口 cvDestroyWindow( "Image1" ); cvDestroyWindow( "Image2" ); cvDestroyWindow( "Image3" ); //释放图像 cvReleaseImage(&image1); cvReleaseImage(&image2); cvReleaseImage(&image3); return 0; }