【问题标题】:Merging two images showing brightness合并两个显示亮度的图像
【发布时间】:2014-07-11 04:55:47
【问题描述】:

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

这是我的两张图片(第一个小插图从内部看是空的,中间不包含亮度)

另一个是

我做的代码是

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();}

它向我展示了类似的结果

但我需要类似的结果

编辑

第一个图像从中心(小插图)是空心/空的,但是当我用我的程序读取图像(小插图)时,它从中心变成实心(明亮),其实现背后的历史是@987654325 @

唯一的问题是第一个(小插图)图像读取,如果它按原样读取,就像中心的空心/空心一样,所以我们合并/混合/加权的另一个图像应用它没有'不影响图像的中心部分,甚至不显示亮度等,这就是我想要做的

【问题讨论】:

  • -1。根据给出的信息,这个问题有太多可能的答案。这不是代码的问题,而是方法的问题。下面是一些要尝试回答的示例问题。当您更改权重时,结果是否与您在问题中显示的结果不同?不同的权重如何变化?您是否尝试过更改背景图片以使其流程不同?
  • 任何可能的工作答案都将被接受,图像首先是中心的空心/空心(小插图),但是当我用我的程序读取图像(小插图)时,它会从center ,这背后的历史是http://stackoverflow.com/questions/23562207/image-change-the-shape-when-displaying
  • 第一个(小插图)图像读取的唯一问题是,如果它按原样读取,就像中心是空的/空的,那么我们与之合并/混合/加权的另一个图像whateva apply 它不会影响图像的中心部分,甚至不会显示亮度等
  • stackoverflow.com/questions/22654770/creating-vignette-filter-in-opencv 的可能副本
  • @AbidRahmanK 没有区别,小插图是径向渐变,其中白色部分包含 alpha/brightness,但这里的问题是我正在合并这个小插图(从中心是空心的/空的像框架一样,效果在侧面,对图像的中心没有影响)与图像

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


【解决方案1】:

又是我 :) 看来你正在编写新的 Photoshop。

我得到的结果:

代码:

#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);
}

【讨论】:

  • 如果在一两天内得不到答案,我肯定会告诉你:) 顺便说一句,谢谢@Andrey,如果我要制作新的 PS,一定要在那里提及你的功劳:)跨度>
  • 如果我对具有红色边的图像做同样的事情,比如小插图是红色的
  • 然后你需要使用透明层作为混合系数(m - 在公式中)逐个像素地混合它们。红色层的公式(适用于每对图像层)是:Iresult_Red=I1_Red(x,y)*m(x,y)+I2_Red(x,y)*(1.0-m(x,y)) ;然后,您将能够使用任何带有透明层的图像作为晕影。没有测试它,但似乎它应该工作。
  • 发现我的错误(但它适用于它:))。更改 Img1.convertTo(Img1,CV_32FC1,1.0/255.0);到 Img1.convertTo(Img1,CV_32FC4,1.0/255.0); (我已经更正了答案。)
  • 我改了,但我恐怕要花多少时间才能成为这样一个好的问题解决者!这样我就可以应对各种情况
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多