【问题标题】:Test for range in RGB value测试 RGB 值的范围
【发布时间】:2020-02-11 18:42:26
【问题描述】:

所以我正在做的是在 vb.net 中创建一个简单的绿屏图像生成器。我的代码很简单(虽然可能不是最有效的)

Dim overlay As Bitmap = New Bitmap(My.Resources.GreenScreen)
    Dim backImage As Bitmap = New Bitmap(My.Resources.Tunnel)

    Dim x As Integer
    Dim y As Integer

    For x = 0 To overlay.Width - 1
        For y = 0 To overlay.Height - 1
            Dim pixelColor As Color = overlay.GetPixel(x, y)
            If pixelColor = Color.FromArgb(255, 0, 254, 0) Then
                overlay.MakeTransparent(overlay.GetPixel(x, y))
            End If
        Next
    Next

    Dim g As Graphics = Graphics.FromImage(backImage)
    g.DrawImage(overlay, 0, 0)
    PictureBox1.Image = backImage

但现在它可以工作,我很满意(有点)

我所面临的是,我下载了一张有人站在绿屏前的示例图像。上面的代码删除了大部分绿色,但不是全部。我需要羽化主题的边缘(我认为这就是所谓的)。

我的想法是我需要捕捉图像中所有不同的绿色阴影,有没有办法可以指定 RGB 的最大和最小范围?

【问题讨论】:

  • 考虑使用 OpenCV (Nuget Emgu.CV) 并且您正在寻求的操作是色度键控
  • 如果不使用 OpenCV,您的方法可以通过锁定位图来加速。 This approach 使用透明蒙版,您当然可以使用。
  • Chroma-key effectDirect-2D 的内置功能,以防您感兴趣。您会在许多开源商业软件中看到这些过滤器的作用。简单地替换像素的内容不会让你走得太远。

标签: vb.net


【解决方案1】:

要在任何输入样本中获得一致的结果,这是一个非常重要的问题,但是,如果您的方法可以为您提供令人满意的结果,也许这就是您所需要的。

您应该计算到特定颜色的距离:

https://en.wikipedia.org/wiki/Color_difference

所以基本上,您选择绿色,确定可接受的距离,然后检查像素颜色的接近程度并对其进行转换。

另外,为了提高性能,请考虑使用Bitmap.LockBits,一次读取所有像素,而不是GetPixel,后者本质上非常慢。

编辑

考虑使用 @djv 评论的方法,设置会稍微复杂一些,但结果会更加一致。

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多