如何为同目录下图片按最高像素值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
相关产品推荐
相关产品推荐

