Уменьшение эффекта красных глаз с помощью nokia imaging SDK

Я пытаюсь реализовать алгоритм уменьшения эффекта красных глаз с помощью 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 альфа-смешение? Что мне делать с альфа-каналом? Еще один важный вопрос - кто-нибудь имел дело с CustomFilterBase? Как я могу обработать только список точек (чтобы я мог использовать _selectedRegionProvider.GetAllSelectedPoints() который возвращает IEnumerable of Point), потому что из того, что я видел OnProcess разделен на несколько частей (поэтому я не могу получить доступ ко всем пикселям в одном OnProcess).

2 ответа

Решение

Хорошие новости! В недавно выпущенном Lumia Imaging SDK 2.0 есть RedEyeRemovalFilter. Вы можете выполнить обновление через NuGet и получить дополнительную информацию на сайте http://dev.windows.com/en-us/featured/lumia.

Обратите внимание, что документация по MSDN в настоящее время довольно повреждена и не полностью обновлена. Надеюсь, это будет исправлено в ближайшее время.

Для справочных документов файл chm в пакете NuGet является текущим и чистым.

Я думаю, что лучшим подходом здесь было бы убрать проверку границ из цикла и проверять один раз за вызов OnProcess. Вы получили плитку для обработки, так что вы можете сравнить ограничивающий прямоугольник плитки с вашим кругом интересов. Если плитка пересекает ваш круг, обработайте пиксели в плитке. Возможно, сохраните также проверку на пиксель, если хотите защитить пиксели за пределами круга.

Пользовательский эффект, хотя он дает вам все пиксели одновременно, конечно, потребляет намного больше памяти. Поэтому я все еще думаю, что вам лучше использовать фильтр (т.е. ориентированный на плитки).

Другие вопросы по тегам