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

使用Python判断扫描书页应存储为bitonal tiff还是color jp2的方案

书籍扫描页自动分类存储方案

你的需求核心是区分「仅含黑白内容的扫描页」和「含有效彩色内容的扫描页」,分别对应不同存储格式,用色彩特征检测的方案就可以实现批量自动处理,准确率足够覆盖绝大多数书籍扫描场景。

具体实现步骤

  • 预处理:先对扫描页执行裁边操作,去除扫描过程中产生的边缘黑边、多余白边,避免无效区域干扰判定。可以用opencv-python库的findContours方法定位有效内容区域,也可以直接用Pillow库的ImageOps.crop做自动裁边。
  • 色彩空间转换:把图像从默认的RGB色彩空间转换为HSV色彩空间,提取S(饱和度)通道的数值,饱和度越高代表颜色越鲜艳。
  • 阈值判定:首先过滤掉接近纯白/纯黑的背景像素,统计剩余有效像素的饱和度:
    • 若饱和度高于设定阈值(推荐设为15,可根据自己的扫描件质量调整)的像素占比低于0.3%,判定为黑白页面,输出bitonal tiff格式
    • 若占比高于阈值,判定为含彩色内容的页面,输出color jp2格式

简化实现代码示例

import cv2
import numpy as np

def judge_page_type(img_path, sat_threshold=15, color_pixel_ratio=0.003):
    img = cv2.imread(img_path)
    # 转换为HSV色彩空间
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    s_channel = hsv[:,:,1]
    # 过滤纯黑纯白背景像素
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    non_bg_mask = (gray > 20) & (gray < 235)
    # 统计有效像素中饱和度超过阈值的占比
    color_pixels = np.sum(s_channel[non_bg_mask] > sat_threshold)
    total_valid = np.sum(non_bg_mask)
    if total_valid == 0:
        return "bw"
    ratio = color_pixels / total_valid
    return "color" if ratio > color_pixel_ratio else "bw"

调优建议

如果你的扫描件有大量泛黄的旧书页面,可以在预处理步骤加一个白平衡校正,把偏黄的底色校正为中性灰色,避免把泛黄误判为彩色内容。如果有批量处理需求,可以把这个判断逻辑和格式转换的逻辑(比如用pillow或者ImageMagick做格式转换)拼在一起,直接批量处理整个文件夹的扫描件即可。

内容的提问来源于stack exchange,提问作者Kirk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:39:03