首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试着转换混合模式的公式

试着转换混合模式的公式
EN

Stack Overflow用户
提问于 2014-04-22 13:12:47
回答 1查看 1.8K关注 0票数 1

我使用opencv c++来制作类似于photoshop的混合模式,我想在它中创建覆盖模式,我在opencv中搜索它的替代方案,其中我找到了这种混合方法,但它不是覆盖模式,因为我想在其中使用覆盖方法。

这份文件叠加法公式

代码语言:javascript
复制
(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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-22 14:40:50

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

想象一下,您想要混合2个图像,img1img2。公式表示,如果img1中的像素作为值Target > 0.5,则结果值是混合图像的(1 - (1-2*(Target-0.5)) * (1-Blend)),其中Blendimg2像素的值。

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

每个像素都需要这样做。

这个链接提供了一个与OpenCV混合的覆盖函数。

下面是一个灰度图像的例子。对于RGB图像,您需要对每个通道执行此操作。当然,img1img2必须具有相同的大小。也许有一种更快的方法可以用OpenCV来实现它。

代码语言:javascript
复制
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);
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23220686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档