正在尝试转换混合模式的公式

Trying to translate formula for blending mode

本文关键字:模式 混合 转换      更新时间:2023-10-16

我使用opencv c++制作混合模式,就像在photoshop中一样,我想在它中制作叠加模式,我在opencv中搜索它的替代品,我在其中找到了这种混合方式,但它不是叠加,因为我想在其中使用叠加方法。

文件中的叠加方法公式

(Target > 0.5) * (1 - (1-2*(Target-0.5)) * (1-Blend)) +
(Target <= 0.5) * ((2*Target) * Blend)

请任何人解释一下这个在opencv c++中实现的公式,我如何容易地理解它的实现,或者它是否有任何already内置函数或任何其他简单的解决方法:p

overlay blending实际做的是Multiplies the light colors and screens the dark colors

首先,您提供的链接的作者假设像素颜色为0到1之间的值。

假设您想要混合两个图像img1img2。该公式表示,如果img1中的像素为值Target > 0.5,则对于混合图像,结果值为(1 - (1-2*(Target-0.5)) * (1-Blend)),其中Blendimg2的像素的值。

另一方面,如果Target <= 0.5,则得到的颜色值将是((2*Target) * Blend)

您需要对每个像素执行此操作。

此链接提供了OpenCV的覆盖混合功能。

这里是一个灰度图像的例子。对于RGB图像,需要对每个通道执行此操作。当然,img1img2必须具有相同的大小。也许OpenCV有一种更快的方法。

Mat img1;
Mat img2;
img1 = imread("img1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
img2 = imread("img2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat result(img1.size(), CV_32F);
for(int i = 0; i < img1.size().height; ++i){
    for(int j = 0; j < img1.size().width; ++j){
        float target = float(img1.at<uchar>(i, j)) / 255;
        float blend = float(img2.at<uchar>(i, j)) / 255;
        if(target > 0.5){
            result.at<float>(i, j) = (1 - (1-2*(target-0.5)) * (1-blend));
        }
        else{
            result.at<float>(i, j) = ((2*target) * blend);
        }
    }
}