我有一个罐子,每分钟通过CRON启动,捕捉海滩摄像头图像并将其保存到文件中。因为它运行24*7,所以它保存了无用的夜间图像。我想让这个罐子来分析这个文件并确定它是否是一个“守护者”。
我所能看到的唯一方法(我还没有对其进行编码)是迭代每个像素,查看每个像素的RGB,如果某个像素的百分比完全或接近黑色,就称其为“丢弃”。这是否一个合理的方法?
FWIW,这张照片是安装在清水滩希尔顿上方的照相机,向西南俯瞰海滩和60号码头--地球上的天堂就是这个爱荷华的男孩。
URL=http\://192.163.243.248/webcams/clearwater.jpg
谢谢,克里斯
发布于 2013-12-03 02:22:07
假设您没有使用图像处理库(我不知道有任何免费的开源库,但您可以查看this thread ),更合理的方法是选择一个行子集。例如,每20行检查一次。如果图像的高度是640,那么你只需要看32条线。您只能检查每2或4或任何像素的每一行。基本原理是从一个像素到另一个像素,甚至每条线,像素值不会有太大差别.尤其是在晚上。
使用某种时间范围,这也是有道理的,但可能需要一些调整,因为日出和日落每天变化。
发布于 2013-12-03 03:50:11
最后,我使用了下面的例程来确定一个图像是否值得保留。它每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;
}https://stackoverflow.com/questions/20341558
复制相似问题