Выполнение эффекта «красных глаз» на изображении в C#
В этом примере показан один подход для уменьшения эффекта «красных глаз». Иногда на снимке глаза человека или животного выходят ярко-красным. Это раздражающий эффект, вызванный вспышкой камеры, отскакивающей от сетчатки человека. К счастью, достаточно легко удалить красные глаза с помощью небольшого кода.
В этом примере вы можете щелкнуть и перетащить, чтобы выбрать область на картинке. Программа исследует пиксели в выбранной области и преобразует любые, которые в основном красны в оттенки серого. Это сохраняет их яркость, но делает их оттенком серого, а не красного. Эффект красных глаз обычно очень яркий, поэтому получающийся оттенок серого также яркий и дает разумный результат.
Программа использует метод RemoveRedeye, показанный в следующем коде, для преобразования красных пикселей в оттенки серого в выбранном прямоугольнике.
// Удаление красных глаз в прямоугольнике. private void RemoveRedeye(Bitmap bm, Rectangle rect) { for (int y = rect.Top; y <= rect.Bottom; y++) { for (int x = rect.Left; x <= rect.Right; x++) { // Посмотрим, имеет ли он больше красного, чем зеленого и синего. Color clr = bm.GetPixel(x, y); if ((clr.R > clr.G) && (clr.R > clr.B)) { // Преобразование в оттенки серого. byte new_clr = (byte)((clr.R + clr.G + clr.B) / 3); bm.SetPixel(x, y, Color.FromArgb(new_clr, new_clr, new_clr)); } } } }
Этот код пересекает пиксели в прямоугольнике. Если красный компонент пикселя больше его синих и зеленых компонентов, код устанавливает все три компонента пикселя в среднем по их исходным значениям. Поскольку красные, зеленые и синие компоненты теперь одинаковы, результатом является оттенок серого.
Обратите внимание, что этот метод преобразует любой пиксель, который является более красным, чем зеленый или синий. Это означает, что если вы выберите область на красном пальто, например, программа преобразует ее в оттенки серого.