合并两个显示亮度的图像

时间:2014-05-22 08:49:37

标签: c++ image opencv image-processing computer-vision

我正在尝试混合两个图像,或者你可以说将一个图像放在其他图像上,当我在图像上应用混合叠加或简单合并两个图像时,它会向我显示亮度。

这是我的两个图像(第一个小插图从内部是空的,它不包含中心的亮度)

,另一个是

我所做的代码是

int main( int argc, char** argv )
{
    Mat img=imread("E:\\vig.png",-1); 
    Mat ch[4]; 
    split(img,ch);
    Mat im2 = ch[3];              // here's the vignette
    im2 = 255 - im2; // eventually cure the inversion
    Mat img2 = imread("E:\\ew.jpg");
    Mat out2;
    blending_overlay3(img2 , im2 , out2);
    imshow("image",out2);
    imwrite("E:\\image.jpg",out2);
    waitKey();}

它显示了像

这样的结果

但我需要像

这样的结果

修改

第一张图片是空心的/空心的(小插图一张),但是当我用我的程序读取图像(小插图一张)然后它从中心变得坚固(明亮)时,其实现背后的历史是{{ 3}}

唯一的问题是它的第一个(晕影)图像读取,如果它按原样读取,就像从中心空心/空,这样我们合并/混合/重量的其他图像应用它没有影响图像的中心部分,甚至不显示亮度等,这就是我想做的事情

1 个答案:

答案 0 :(得分:3)

它又是我:)看来你正在写新的photoshop。

我得到的结果: enter image description here

代码:

#include <iostream>
#include <vector>
#include <stdio.h>
#include <functional>
#include <algorithm>
#include <numeric>
#include <cstddef>
#include "opencv2/opencv.hpp"
#include <iostream>
#include <fstream>

using namespace std;
using namespace cv;
 int main( int argc, char** argv )
{
    namedWindow("Image");

    Mat Img1=imread("Img1.png",-1);
    Mat Img2=imread("Img2.png");
    cv::resize(Img1,Img1,Img2.size());
    Img1.convertTo(Img1,CV_32FC4,1.0/255.0);
    Img2.convertTo(Img2,CV_32FC3,1.0/255.0);

    vector<Mat> ch; 
    split(Img1,ch);

    Mat mask = ch[3].clone();              // here's the vignette

    ch.resize(3);

    Mat I1,I2,result;

    cv::multiply(mask,ch[0],ch[0]);
    cv::multiply(mask,ch[1],ch[1]);
    cv::multiply(mask,ch[2],ch[2]);
    merge(ch,I1);

    vector<Mat> ch2(3);
    split(Img2,ch2);
    cv::multiply(1.0-mask,ch2[0],ch2[0]);
    cv::multiply(1.0-mask,ch2[1],ch2[1]);
    cv::multiply(1.0-mask,ch2[2],ch2[2]);
    merge(ch2,I2);

    result=I1+I2;

    imshow("Image",result);
    waitKey(0);
}