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
相关产品推荐
相关产品推荐

