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

如何为同目录下图片按最高像素值X%设置动态阈值(Python3)

基于单图最高像素百分比的动态阈值二值化实现

核心思路

抛弃固定阈值的思路,对每张图片单独计算适配自身的阈值:先提取当前灰度图的最高像素值,再乘以你设定的百分比(比如80%就乘0.8),用这个动态生成的值作为二值化阈值,确保不同亮度、对比度的图片都能得到合适的处理效果。

完整代码示例

import cv2
import os
import glob

# 配置参数
INPUT_DIR = "./"  # 图片所在的目标目录,这里设为当前目录
OUTPUT_DIR = "./processed_images"  # 处理后图片的保存目录
THRESHOLD_PERCENT = 0.8  # 阈值占最高像素的比例,可自行调整(比如0.7、0.9)

# 自动创建输出目录(不存在则新建)
os.makedirs(OUTPUT_DIR, exist_ok=True)

# 批量获取目录下的图片文件(支持jpg、png,可自行添加格式)
image_paths = glob.glob(os.path.join(INPUT_DIR, "*.[jp][pn]g"))

for img_path in image_paths:
    # 读取图片并转为灰度图
    raw_img = cv2.imread(img_path)
    if raw_img is None:
        print(f"跳过无法读取的文件: {img_path}")
        continue
    gray_img = cv2.cvtColor(raw_img, cv2.COLOR_BGR2GRAY)
    
    # 获取当前图片的最高像素值
    _, max_pixel = cv2.minMaxLoc(gray_img)
    
    # 计算动态阈值并取整(OpenCV要求阈值为整数)
    dynamic_thresh = int(round(max_pixel * THRESHOLD_PERCENT))
    
    # 应用二值化处理
    _, thresh_img = cv2.threshold(gray_img, dynamic_thresh, 255, cv2.THRESH_BINARY)
    
    # 保存处理后的图片
    filename = os.path.basename(img_path)
    save_path = os.path.join(OUTPUT_DIR, f"processed_{filename}")
    cv2.imwrite(save_path, thresh_img)
    print(f"处理完成: {save_path}")

关键代码说明

  • cv2.minMaxLoc(gray_img):直接返回灰度图的最小、最大像素值,这里我们只需要第二个返回值max_pixel。
  • dynamic_thresh = max_pixel * THRESHOLD_PERCENT:根据设定比例计算动态阈值,取整是为了适配OpenCV阈值函数的参数要求。
  • 如果你的图片本身就是灰度格式,可以直接用gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)读取,省去转灰度的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:49