You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:18