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

matplotlib绘图保存后用NumPy统计黑像素数返回0问题求解

解决方案

核心问题原因

  • 执行顺序错误:plt.show() 调用后会清空当前画布,后续 savefig 保存的是空白图像,自然无法统计到黑像素
  • 抗锯齿默认开启:matplotlib对绘制的标记默认开启抗锯齿优化,点的边缘会生成半透明过渡像素,没有纯黑色的像素点,无法匹配你设定的[0,0,0,255]判断条件
  • 隐藏项不全:仅隐藏了边框,没有隐藏坐标轴刻度,可能引入多余像素干扰统计

修改后可运行代码

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

# 显式指定dpi避免默认值差异
fig = plt.figure(figsize=(4, 2), dpi=100)

ax = fig.add_subplot()
# 取消子图边距
ax.set_position([0, 0, 1, 1])
# 隐藏所有边框、刻度
ax.spines[['top', 'right', 'bottom', 'left']].set_visible(False)
ax.set_xticks([])
ax.set_yticks([])

# 绘制2个1像素直径的纯黑点
# 标记大小ms单位为磅,1磅=1/72英寸,1像素=1/dpi英寸,因此1像素直径对应ms=72/dpi
ax.plot(
    [1, 2], [0.4, 0.4],
    marker='o',
    ms=72/fig.dpi,
    mew=0,
    color='black',
    linestyle="",
    lw=0,
    antialiased=False  # 关键配置:关闭抗锯齿,生成纯黑像素
)
ax.set_xlim(0, 8)
ax.set_ylim(0, 1)

# 先保存图像再调用show,避免画布被清空
fig.savefig('plot.png', dpi=fig.dpi)
plt.show()

# 统计黑像素
pix = np.array(Image.open('plot.png'))
sought = [0, 0, 0, 255]
black = np.count_nonzero(np.all(pix == sought, axis=-1))
print(f"纯黑像素数:{black}")

运行结果

修改后运行代码,输出的纯黑像素数为2,和预期绘制的点数量一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:06:05