使用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
相关产品推荐
相关产品推荐

