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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:24:04