Python OpenCV如何判断阈值化处理后的图像整体偏黑还是偏白
问题原因
导致结果异常的核心原因有两点:
- 直方图统计范围配置错误:经过
cv2.THRESH_BINARY阈值化处理后的图像,像素值只有0(纯黑)和255(纯白)两种取值,但你调用cv2.calcHist时传入的统计范围是[0,1],255完全不在该区间内,会被直接排除在统计逻辑外。最终仅值为0的像素会被统计,所以无论测试偏黑还是偏白的图像,得到的统计结果都会高度一致。 - 变量名笔误:你计算归一化时使用的变量是
hist_ok,但前一步直方图计算返回的变量名为hist,实际运行时会直接触发未定义变量的报错。
正确实现方案
方法1:修正直方图统计逻辑
将直方图统计范围调整为覆盖0-255的全像素区间,即可得到正确的黑白像素占比,参考代码如下:
import cv2 import numpy as np # 原有阈值化流程,补充注意:cv2.imread默认以BGR格式读取图像,转灰度建议使用对应的COLOR_BGR2GRAY参数 image = cv2.imread('img_path') image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, frame_thresh = cv2.threshold(image_gray,128,255,cv2.THRESH_BINARY) # 修正后的直方图统计:bins设为2,范围覆盖0-255全区间 hist = cv2.calcHist([frame_thresh], [0], None, [2], [0,256]) # 归一化得到占比 hist_normalized = hist / hist.sum() black_ratio = hist_normalized[0][0] # 黑像素总占比 white_ratio = hist_normalized[1][0] # 白像素总占比 if black_ratio > white_ratio: print("图像整体偏黑") else: print("图像整体偏白")
方法2:更高效的平均值判断
因为阈值化后的图像只有0和255两种像素值,直接计算全局像素平均值即可快速判断黑白倾向,无需计算直方图,代码更简洁高效:
avg_pixel = np.mean(frame_thresh) # 平均值小于127.5说明黑像素占比更高,反之白像素占比更高 if avg_pixel < 127.5: print("图像整体偏黑") else: print("图像整体偏白")
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

