首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何利用灰度转换映射在两幅图像之间进行转换

如何利用灰度转换映射在两幅图像之间进行转换
EN

Stack Overflow用户
提问于 2009-11-08 17:58:11
回答 2查看 690关注 0票数 1

假设你有两个图像A和B,第三个灰度图像T.A和B包含几乎任何东西,但假设它们是一个游戏的两个场景。

现在,假设T包含一个钻石梯度。由于灰阶,它从外面的黑色变成了内部的白色。

随着时间的推移,让我们假设256没有进一步阐述的“蜱”匹配灰度,A应该过渡到B给钻石擦拭效果。如果T包含一个由较小的矩形梯度组成的网格,它就像图像的每个部分都做了一个矩形擦拭。

如果您曾经与RPG制造商或大多数视觉新颖的引擎合作过,您可能会认识到这个概念。

当然,问题是如何做到这一点。我知道这涉及到A和B之间的每像素混合,但这就是我所得到的。

为了额外的奖励,软边呢?

和现在,结论

最后的实验,基于eJames的代码

来自最终实验的样本--波浪上升,50% http://helmet.kafuka.org/TransitionsSample.png

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-08 19:09:20

T图像中的灰度值表示时间偏移。在每像素的基础上,您的擦除效果基本如下:

代码语言:javascript
代码运行次数:0
运行
复制
for (timeIndex from 0 to 255)
{
    for (each pixel)
    {
        if (timeIndex < T.valueOf[pixel])
        {
            compositeImage.colorOf[pixel] = A.colorOf[pixel];
        }
        else
        {
            compositeImage.colorOf[pixel] = B.colorOf[pixel];
        }
    }
}

为了说明,想象一下在timeIndex的几个值上发生了什么

  1. timeIndex == 0 (0%):这是过渡的开始。此时,合成图像中的大部分像素将是图像A的像素,除非T中的相应像素是完全黑色的。在这种情况下,合成图像像素将是图像B的像素。
  2. timeIndex == 63 (25%):此时,更多来自图像B的像素已将其输入复合图像。每个T值小于25%的像素都将从图像B中提取,其余仍为图像A。
  3. timeIndex == 255 (100%):此时,T中的每个像素都将否定条件,因此复合图像中的所有像素都是图像B的像素。

为了“平滑”过渡,您可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
for (timeIndex from 0 to (255 + fadeTime))
{
    for (each pixel)
    {
        blendingRatio = edgeFunction(timeIndex, T.valueOf[pixel], fadeTime);
        compositeImage.colorOf[pixel] =
                    (1.0 - blendingRatio) * A.colorOf[pixel] + 
                    blendingRatio * B.colorOf[pixel];
    }
}

edgeFunction的选择取决于你。这一次产生了从A到B的线性过渡:

代码语言:javascript
代码运行次数:0
运行
复制
float edgeFunction(value, threshold, duration)
{
    if (value < threshold) { return 0.0; }
    if (value >= (threshold + duration)) { return 1.0; }

    // simple linear transition:
    return (value - threshold)/duration;
}
票数 4
EN

Stack Overflow用户

发布于 2009-11-08 19:08:25

我会说,你从图像A开始,然后在每一步中,你对T小于我的每个位置使用图像A的像素,否则就用图像B的像素。

对于软边缘,可以定义另一个参数d,并计算像素P,如下所示:

对于每一点(x,y),您可以选择以下三个选项:

  • I< T(x,y) -d,则点等于A的点。
  • T(x,y) -d <= i< T(x,y) +d设z=i- (T(x,y) -d),点等于A(x,y)(1-z/(2d)) + B(x,y)(z/(2d))
  • I< T(x,y) +d,则点等于B的点。

这会产生一个线性边,当然,您可以在任意数量的函数之间进行选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1697356

复制
相关文章

相似问题

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