使用诺基亚成像SDK减少红眼

时间:2014-10-01 19:32:53

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

我尝试使用诺基亚成像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 = 0xFF000000RedBitMask = 0x00FF0000GreenBitMask = 0x0000FF00,  BlueBitMask = 0x000000FF

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

Results in left circle

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

2 个答案:

答案 0 :(得分:2)

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

请注意,MSDN上的文档目前已经完全破坏,并且不完全是最新的。希望这很快就能解决。

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

答案 1 :(得分:1)

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

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