【问题标题】:Java - analyze image for darknessJava - 分析黑暗的图像
【发布时间】:2013-12-03 11:50:11
【问题描述】:

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

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

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

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

谢谢, 克里斯

【问题讨论】:

  • 为什么不直接使用时间范围?
  • 不错的应用程序。我想自己开发。
  • 使用时间范围是我的第一个想法,但时间每天都在变化。

标签: java image-processing


【解决方案1】:

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

按照建议使用某种时间范围也是有道理的,但可能需要进行一些调整,因为日出和日落每天都在变化。

【讨论】:

  • 这里没有图书馆,我只是为了自娱自乐。学习一点关于图像处理的知识是从日常 SpringMVC 工作中很好的消遣。
  • 关于时间范围 - 日出和日落每天都在变化,因此除非我使用提供此类时间的公共 Web 服务,而且我知道没有此类服务,否则这种方法不实用。跨度>
【解决方案2】:

我最终使用下面的例程来确定图像是否值得保留。它查看每 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;
}

【讨论】:

  • 请让我们知道这些任意数字的成功程度。顺便说一句,我认为参数化这些数字会更好。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2021-09-12
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多