簡體   English   中英

使用諾基亞成像SDK消除紅眼

[英]Red Eye reduction with nokia 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 = 0x0000FF00BlueBitMask = 0x000000FF

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

結果在左圈

問題是:諾基亞影像SDK是否使用某些alpha混合? 我應該如何使用Alpha通道? 另一個重要的問題-是否有人處理過CustomFilterBase 我如何只處理點列表(所以我可以使用_selectedRegionProvider.GetAllSelectedPoints()返回點的IEnumerable),因為從我看到的OnProcess分為多個部分(所以我無法訪問單個OnProcess中的所有像素) 。

好消息! 新發布的Lumia Imaging SDK 2.0中有一個RedEyeRemovalFilter。 您可以通過NuGet進行升級,並訪問http://dev.windows.com/en-us/featured/lumia了解更多信息。

請注意,MSDN上的文檔當前已被破壞,並且尚未完全更新。 希望這個問題會盡快解決。

對於參考文檔,NuGet軟件包中的chm文件是最新的且干凈的。

我認為最好的方法是將邊界檢查移出循環,並在每次調用OnProcess時檢查一次。 您將得到一個要處理的圖塊,因此您可以將圖塊的邊界矩形與您的興趣圈進行比較。 如果瓷磚與您的圓相交,請處理瓷磚中的像素。 如果要保護圓外的像素,則可能還要保留每個像素的檢查。

自定義效果雖然可以一次為您提供所有像素,但是當然會消耗更多的內存。 因此,我仍然認為您最好使用過濾器(即面向圖塊的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM