Java - 分析图像的黑暗

时间:2013-12-03 02:08:15

标签: java image-processing

我有一个通过CRON每分钟启动一个jar来捕获海滩网络摄像头图像并将其保存到文件中。由于它运行24 * 7,因此可以节省无用的夜间图像。我想要jar来分析文件并确定它是否是“守护者”。

我能看到的唯一方法(我还没编码)是遍历每个像素,查看每个像素的RGB,如果某些像素的百分比是完全或接近黑色,则将其称为一次性。这是一种合理的方法吗?

FWIW,图像来自安装在克利尔沃特海滩希尔顿酒店顶部的摄像机,俯瞰西南海滩和60号码头 - 地球上的天堂,这个爱荷华州的男孩。

URL = HTTP \://192.163.243.248/webcams/clearwater.jpg

谢谢, 克里斯

2 个答案:

答案 0 :(得分:1)

假设您没有使用图像处理库(我不知道任何免费的开源库,但您可以查看this thread),更合理的方法是选择行的子集。例如,检查每20行。如果图像的高度为640,则只需要查看32行。您只能检查每个第2或第4行或每行上的任何像素。基本原理是像素到像素,甚至是线到线,像素值不会有太大差异......特别是在晚上。

使用某种时间范围,如同建议也有意义,但可能需要一些调整,因为日出和日落每天都在变化。

答案 1 :(得分:1)

我最终使用下面的例程来确定图像是否值得保留。它会查看每第10行的每10个像素,如果红色,绿色和蓝色分量的总和小于30(我从无处拉出的数字),则将像素调暗。如果10%(另一个任意数字)或更多像素是暗的,则图像是暗的。

private boolean keepImage(BufferedImage bufferedImage){
    int imageHeight = bufferedImage.getHeight();
    int imageWidth = bufferedImage.getWidth();

    long pixelCount = 0;
    long darkPixels = 0;
    for(int y=0;y<imageHeight;y+=10){
        for(int x=0;x<imageWidth;x+=10){
            pixelCount++;
            int rgb = bufferedImage.getRGB(x, y);
            int red = (rgb >> 16) & 0x000000FF;
            int green = (rgb >>8 ) & 0x000000FF;
            int blue = (rgb) & 0x000000FF;
            if (red + green + blue < 30)
                darkPixels++;
        }
    }
    float darkQuotient = (float)darkPixels/(float)pixelCount;
    return darkQuotient<0.1;
}