防红眼算法
image-processing
7
0

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 8 个回答
高赞 时间 活跃

这是Java实现解决方案

public void corrigirRedEye(int posStartX, int maxX, int posStartY, int maxY, BufferedImage image) {
    for(int x = posStartX; x < maxX; x++) {
        for(int y = posStartY; y < maxY; y++) {

            int c = image.getRGB(x,y);
            int  red = (c & 0x00ff0000) >> 16;
            int  green = (c & 0x0000ff00) >> 8;
            int  blue = c & 0x000000ff;

            float redIntensity = ((float)red / ((green + blue) / 2));
            if (redIntensity > 2.2) {
                Color newColor = new Color(90, green, blue);
                image.setRGB(x, y, newColor.getRGB());
            }


        }
    }
}

从诸如open cv之类的应用程序检测到的两个矩形中检索的参数(这应该是包含眼睛位置的矩形)

int posStartY = (int) leftEye.getY();

    int maxX = (int) (leftEye.getX() + leftEye.getWidth());
    int maxY = (int) (leftEye.getY() + leftEye.getHeight());

    this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image);

    // right eye

    posStartX = (int) rightEye.getX();
    posStartY = (int) rightEye.getY();

    maxX = (int) (rightEye.getX() + rightEye.getWidth());
    maxY = (int) (rightEye.getY() + rightEye.getHeight());

    this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image);
收藏
评论

一个吸引人的图书馆是openCV 。它具有非常丰富的图像处理功能。也看到这个文件与伊利亚五萨福诺夫的标题是“自动红眼检测”。

收藏
评论

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

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

//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));
}

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

收藏
评论

您可以尝试imagemagick-此页面上的一些技巧

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

在页面上搜索红眼

收藏
评论

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

收藏
评论

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

收藏
评论

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

然后,您需要确定用它们替换的内容,并假设图像中有足够的绿色/蓝色数据,您可以简单地忽略红色通道。

OpenCV是一个非常好的用于图像处理的免费库,对于您想要的内容来说可能是过高的选择-但是它有很多示例,并且社区非常活跃。您还可以搜索对象跟踪算法,在场景中跟踪有色对象是一个非常常见的问题。

收藏
评论

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

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号