OpenCV实现将三幅图像合并在一张图片

*****************/
#include <cv.h>
#include <highgui.h>
int main()
{
    char* filePath ="D:/图片库/Lena.jpg";
    IplImage* srcImg = cvLoadImage(filePath);
    IplImage* greyImg = cvCreateImage(cvGetSize(srcImg), srcImg->depth, 1);
    IplImage* cannyImg = cvCreateImage(cvGetSize(greyImg), srcImg->depth, 1);
    CvSize dstSize;
    dstSize.width = srcImg->width *3.0;
    dstSize.height = srcImg->height;
    IplImage* dstImg = cvCreateImage(dstSize, srcImg->depth, srcImg->nChannels);
    cvZero(dstImg);
    cvConvertImage(srcImg, greyImg);    
    cvCanny(greyImg, cannyImg, 150, 100);
    //----------------------------------
    //载入原图像到目标图像
    cvSetImageROI(dstImg, cvRect(0, 0, srcImg->width, srcImg->height));
    cvCopy(srcImg, dstImg);
     cvResetImageROI(dstImg);
    //载入灰度图像到目标图像
    cvSetImageROI(dstImg, cvRect(srcImg->width, 0, srcImg->width, srcImg->height));
    dstImg->nChannels =1;
    cvCopy(greyImg, dstImg);
    cvResetImageROI(dstImg);
    //载入边缘检测图像到目标图像
    cvSetImageROI(dstImg, cvRect((srcImg->width) *2.0, 0, srcImg->width, srcImg->height));
    dstImg->nChannels =1;
    cvCopy(cannyImg, dstImg);
    cvResetImageROI(dstImg);
    //---------------------------------------
    cvNamedWindow("dstImg");
    cvShowImage("dstImg", dstImg);
    cvWaitKey(0);
    cvReleaseImage(&srcImg);
    cvReleaseImage(&greyImg);
    cvReleaseImage(&cannyImg);
    cvReleaseImage(&dstImg);
    cvDestroyWindow("dstImg");
    return0;

这篇文章还是我开通这个博客以来的第一篇文章,虽然我现在已经不再做图像方面的东西,但是看到这篇下面有很多留言,我觉得是这篇文章的题目给大家造成了误解。大家需要了解的应该是不同视角下的图像拼接,而我这里只是简简单单的将两个图像凑在一起,期间没有任何图像特征提取的方法在这里,因此,对于初学OpenCV的人来说,这里的代码可以作为入门级教程。

 http://www.cnblogs.com/CBDoctor/archive/2011/09/19/2180998.html


 

下面是几个知识点:

(1)路径的设置方式:通常情况下,需要把包含图片的文件夹保存到工程目录下,也就是保证和Debug在同一个根目录下面;

(2)cvSetImageROI函数和cvCopy函数的用法:

cvSetImageROI(IplImage*dst,cvRect(左边界,上边界,宽度,高度))。他的作用是把图像在图像dst中开辟出cvRect矩形框区域大小的内存空间,然后cvCopy(IplImage*src,IplImage*dst)函数会将源图像src复制到目标图像dst中。



automatedMSRCR (Automatic Multi-Scale Retinex with Color Restoration) 算法是一种图像增强算法,它可以增强图像的对比度,保留细节和颜色。下面是使用 OpenCV C++ 实现 automatedMSRCR 算法的示例代码: ```c++ #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace cv; Mat automatedMSRCR(Mat input, float sigma_list[], int sigma_list_size, float G, float b, int alpha, int beta, int low_clip, int high_clip) { Mat L; input.convertTo(L, CV_32FC1); L = log(L + 1.0f); Mat R; for (int i = 0; i < sigma_list_size; i++) { Mat tmp; GaussianBlur(input, tmp, Size(0, 0), sigma_list[i], sigma_list[i], BORDER_DEFAULT); tmp.convertTo(tmp, CV_32FC1); tmp = log(tmp + 1.0f) - L; tmp = exp(tmp - G); R += tmp; } R /= sigma_list_size; Mat output; output = input * (1.0f - b) + R * b; output.convertTo(output, CV_8UC3); std::vector<Mat> channels; split(output, channels); for (int i = 0; i < 3; i++) { channels[i] = (channels[i] - mean(channels[i])) * alpha + mean(channels[i]); threshold(channels[i], channels[i], 0, 255, THRESH_TOZERO); normalize(channels[i], channels[i], low_clip, high_clip, NORM_MINMAX); } merge(channels, output); return output; } int main() { Mat input = imread("input.jpg"); float sigma_list[] = { 15.0f, 80.0f, 250.0f }; int sigma_list_size = sizeof(sigma_list) / sizeof(float); float G = 5.0f; float b = 25.0f; int alpha = 125; int beta = 46; int low_clip = 0; int high_clip = 255; Mat output = automatedMSRCR(input, sigma_list, sigma_list_size, G, b, alpha, beta, low_clip, high_clip); imshow("input", input); imshow("output", output); waitKey(); return 0; } ``` 在这个示例中,我们使用了 OpenCV 的核心模块(core)、图像 I/O 模块(highgui)和图像处理模块(imgproc)。具体来说,我们使用了以下函数: - `imread()`:加载输入图像。 - `GaussianBlur()`:对输入图像进行高斯模糊。 - `split()`:将输出图像的三个通道分离。 - `mean()`:计算每个通道的均值。 - `threshold()`:将每个通道的像素值截断为 0 到 255 之间。 - `normalize()`:将每个通道的像素值归一化为 0 到 255 之间。 - `merge()`:将三个通道合并为一幅图像。 - `imshow()`:显示图像。 - `waitKey()`:等待用户按键。 在实现 automatedMSRCR 算法时,我们需要将输入图像转换为浮点数类型,然后进行对数变换。接着,我们使用高斯模糊对输入图像进行多尺度处理,计算出 R 通道。最后,我们将 R 通道与输入图像的原始亮度值进行加权平均,并对每个通道进行颜色修正和像素值调整,最终得到增强后的图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值