防红眼算法

时间:2020-03-06 14:43:25  来源:igfitidea点击:

我需要为正在处理的应用程序实现防红眼功能。

谷歌搜索主要提供指向商业最终用户产品的链接。

我们是否知道可以在GPL应用程序中使用的良好的防红眼算法?

解决方案

最简单的算法(仍然是非常有效的一种算法)是将感兴趣区域的RGB三元组的R值清零。

红色消失,但其他颜色保留下来。

该算法的进一步扩展可能涉及仅将红色为主要颜色(R> G和R> B)的三元组的R值归零。

如果没有其他人提出更直接的答案,则我们始终可以下载GIMP的源代码,并查看其工作方式。

我们可以尝试使用imagemagick-此页面上的一些技巧

http://www.cit.gu.edu.au/~anthony/info/graphics/imagemagick.hints

在页面上搜索红眼

首先,我们需要找到眼睛!
标准方法是先运行边缘检测器,然后进行霍夫变换,以找到两个相同大小的圆,但是可能会有更简单的算法来简单地找到红色像素簇。

然后,假设图像中有足够的绿色/蓝色数据,我们可以决定用什么替换它们,而我们可以简单地忽略红色通道。

OpenCV是一个非常好的用于图像处理的免费库,它可能对我们想要的内容有些过分,但是有很多示例和非常活跃的社区。
我们还可以搜索对象跟踪算法,在场景中跟踪有色对象是一个非常常见的问题。

开源项目Paint.NET具有C#的实现。

openCV是一个吸引人的好图书馆。
它具有非常丰富的图像处理功能。
另请参阅Ilia V. Safonov撰写的标题为"自动红眼检测"的论文。

我在这里参加聚会很晚,但是对于以后的搜索者,我为我编写的个人应用程序使用了以下算法。

首先,由用户选择要缩小的区域,并将其作为中心点和半径传递给红眼缩小方法。该方法循环遍历半径内的每个像素并执行以下计算:

//Value of red divided by average of blue and green:
Pixel pixel = image.getPixel(x,y);
float redIntensity = ((float)pixel.R / ((pixel.G + pixel.B) / 2));
if (redIntensity > 1.5f)  // 1.5 because it gives the best results
{
    // reduce red to the average of blue and green
    bm.SetPixel(i, j, Color.FromArgb((pixel.G + pixel.B) / 2, pixel.G, pixel.B));
}

我非常喜欢这种结果,因为它们保持了色彩强度,这意味着不会减少眼睛的光反射。 (这意味着眼睛保持其"活着"的外观。)