Уменьшение эффекта красных глаз с помощью 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. Вы получили плитку для обработки, так что вы можете сравнить ограничивающий прямоугольник плитки с вашим кругом интересов. Если плитка пересекает ваш круг, обработайте пиксели в плитке. Возможно, сохраните также проверку на пиксель, если хотите защитить пиксели за пределами круга.
Пользовательский эффект, хотя он дает вам все пиксели одновременно, конечно, потребляет намного больше памяти. Поэтому я все еще думаю, что вам лучше использовать фильтр (т.е. ориентированный на плитки).