如何用PHP检测近全黑监控快照并忽略固定位置白色时间戳?
修改后的PHP脚本方案
针对你的问题,原脚本只检查随机点是否全为0(纯黑),但因为存在白色时间戳,必然会有非0点,所以无法识别这类近全黑图。我们可以通过统计采样点的亮度分布来解决:大部分区域是极暗的黑色,只有极少数点是高亮的时间戳,就判定为需要删除的图片。
修改后的代码
<?php function check_if_near_black($src) { $img = imagecreatefromjpeg($src); if (!$img) { return "invalid image"; // 处理图片加载失败的情况 } list($width_orig, $height_orig) = getimagesize($src); $sample_count = 100; // 增加采样点数量,提升判断准确性 $dark_threshold = 10; // 暗点的亮度阈值(接近纯黑) $bright_threshold = 200; // 亮点的亮度阈值(接近白色,对应时间戳) $bright_max_allowed = 3; // 允许的最大亮点数量 $dark_count = 0; $bright_count = 0; for ($i = 0; $i < $sample_count; $i++) { $rand_width = rand(0, $width_orig - 1); // 避免超出图片边界 $rand_height = rand(0, $height_orig - 1); $rgb = imagecolorat($img, $rand_width, $rand_height); // 分解RGB值并计算标准亮度 $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $luminance = ($r * 0.299 + $g * 0.587 + $b * 0.114); if ($luminance < $dark_threshold) { $dark_count++; } elseif ($luminance > $bright_threshold) { $bright_count++; } // 中间亮度的点直接忽略(说明不是目标近黑图) } imagedestroy($img); // 释放图片资源,避免内存泄漏 // 判断逻辑:暗点占绝大多数,且亮点数量不超过允许值 if ($dark_count >= $sample_count - $bright_max_allowed && $bright_count <= $bright_max_allowed) { return "near_black"; // 判定为需要删除的近全黑图 } else { return "not_near_black"; } } ?>
关键改动说明
- 增加采样点数量:从20个提升到100个,让统计结果更可靠,避免偶然采样到时间戳点就误判。
- 亮度判断而非纯黑判断:不再只检查像素是否为0,而是通过亮度值区分暗点和亮点,适配近黑而非纯黑的场景。
- 统计阈值控制:设置允许的最大亮点数量(比如3个),只要大部分点是暗的,且亮点极少,就判定为目标图。
- 边界处理:修正随机坐标的范围,避免超出图片宽度/高度导致的错误。
- 资源释放:增加
imagedestroy($img),避免长时间运行后内存泄漏。
使用示例
你可以这样调用函数来处理图片:
$image_path = "path/to/your/snapshot.jpg"; $result = check_if_near_black($image_path); if ($result === "near_black") { unlink($image_path); // 删除符合条件的图片 echo "Deleted near-black image: " . $image_path; } elseif ($result === "invalid image") { echo "Failed to load image: " . $image_path; } else { echo "Image is normal: " . $image_path; }
可调参数说明
如果你的时间戳位置或大小有变化,可以调整以下参数优化判断:
$sample_count:采样点数量,越多越准确,但速度稍慢。$dark_threshold:暗点阈值,数值越小越接近纯黑。$bright_threshold:亮点阈值,数值越大越接近纯白。$bright_max_allowed:允许的最大亮点数,根据时间戳的大小调整(比如时间戳占的点多,就适当调高)。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

