【问题标题】:Red Eye reduction with nokia imaging SDK使用诺基亚成像 SDK 减少红眼
【发布时间】:2014-11-26 18:02:36
【问题描述】:

我尝试使用 Nokia Imaging SDK 实现红眼消除算法。我已经编写了选择眼圈的控件,因此我不需要分割/面部检测阶段(我在一个圆圈内有点列表)-我是这样实现的:

 protected override void OnProcess(PixelRegion sourcePixelRegion, PixelRegion targetPixelRegion)
    {
        int currentRow = 0;

        targetPixelRegion.ForEachRow((index, width, position) =>
        {
            for (int x = 0; x < width; ++x)
            {
                uint currentPixelColor = sourcePixelRegion.ImagePixels[index + x];

                if (_selectedRegionProvider.IsPointInSelectedRegion(position.X + x, position.Y + currentRow))
                {
                    uint alphaChannel = (currentPixelColor & AlphaBitMask) >> 24;
                    uint redChannel = (currentPixelColor & RedBitMask) >> 16;
                    uint greenChannel = (currentPixelColor & GreenBitMask) >> 8;
                    uint blueChannel = (currentPixelColor & BlueBitMask);

                    float greenBlueChannelAvg = (greenChannel + blueChannel)/2.0f;

                    float redIntensity = (float) (redChannel/greenBlueChannelAvg);
                    if (redIntensity > 0.5)
                        redChannel = Math.Min(255, (uint)((greenChannel+blueChannel)/2.0));

                    currentPixelColor = (alphaChannel << 24) | (redChannel << 16) | (greenChannel << 8) | blueChannel;
                }

                targetPixelRegion.ImagePixels[index + x] = currentPixelColor;
            }

            currentRow++;
        });
    }

在哪里 AlphaBitMask = 0xFF000000, RedBitMask = 0x00FF0000, GreenBitMask = 0x0000FF00, BlueBitMask = 0x000000FF

但是我得到了奇怪的结果:

问题是:Nokia Imaging SDK 是否使用了一些 alpha 混合?我应该如何处理 alpha 通道?另一个重要问题 - 有人处理过CustomFilterBase 吗?我怎样才能只处理点列表(所以我可以使用返回 IEnumerable 的点的_selectedRegionProvider.GetAllSelectedPoints()),因为从我所看到的OnProcess 被分成多个部分(所以我无法访问单个 OnProcess 中的所有像素) .

【问题讨论】:

  • 只是在 CustomFilterBase 上进行修改:(自定义)过滤器是基于图块的,所以你是对的,在每个 OnProcess 中你只能访问图像的一个子部分。您仍然可以使用自定义过滤器,并且只处理您现在也可以访问的像素(相交)。或者您可以改用自定义效果 (CustomEffectBase),这样您就可以一次访问所有像素 - 当然,它还需要更大的缓冲区,因此内存消耗会更高。
  • 通过 alpha 通道,不要更改它。此外,是的,您的 OnProcess 将在每个图像图块中调用一次。您可能想考虑改用 CustomEffectBase。过滤器是面向平铺的,而效果是面向位图的。如果您在自定义效果的构造函数中选择就地编辑,则可以只处理您感兴趣的像素,而不必遍历其余像素。
  • 请注意,您也可以事先剪掉感兴趣的区域,例如使用 Bitmap 的构造函数,该构造函数采用另一个位图和一个裁剪矩形。 (然后它引用原始图像,不复制。)

标签: c# windows-phone-8 image-processing nokia-imaging-sdk lumia-imaging-sdk


【解决方案1】:

我认为这里最好的方法是将边界检查移出循环,并在每次调用 OnProcess 时检查一次。您将获得一个要处理的图块,因此您可以将图块的边界矩形与您的兴趣圈进行比较。如果图块与您的圆圈相交,则处理图块中的像素。如果你想保护圆圈外的像素,也许还要保留每像素检查。

自定义效果,虽然它同时为您提供所有像素,但当然会消耗更多内存。所以我仍然认为你最好使用过滤器(即面向图块)。

【讨论】:

    【解决方案2】:

    好消息!新发布的 Lumia Imaging SDK 2.0 中有一个 RedEyeRemovalFilter。您可以通过 NuGet 进行升级,并访问http://dev.windows.com/en-us/featured/lumia 了解更多信息。

    请注意,MSDN 上的文档目前已损坏,并且不是完全最新的。希望这将很快得到解决。

    对于参考文档,NuGet 包中的 chm 文件是最新且干净的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多