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

使用Pandas为含58000列的DataFrame绘制像素分布直方图遇阻求助

图像像素分布直方图绘制优化方案

你的代码核心问题是:用hlack_df.hist()时,pandas会为每一列(也就是每个像素)绘制单独的直方图——58000列等于要生成58000个小图,这必然耗时极长,完全是做无用功。

最优实现方法(直接用numpy+matplotlib,无需DataFrame)

直接对图像的像素数组做扁平化处理,然后绘制单一直方图,这是效率最高的方式:

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

# 读取图像并转成数组
hlack_img = Image.open("Henrietta_Lacks.jpg")
hlack_arr = np.array(hlack_img)

# 处理彩色图(如果是灰度图可跳过此步骤)
if len(hlack_arr.shape) == 3:
    # 转灰度图(也可以用hlack_img.convert('L')直接转灰度再转数组)
    hlack_arr = hlack_arr.mean(axis=2)

# 扁平化像素数组,得到所有像素值的一维数组
pixel_values = hlack_arr.flatten()

# 绘制直方图
plt.hist(pixel_values, bins=256, range=(0, 255))
plt.title("像素值分布直方图")
plt.xlabel("像素值")
plt.ylabel("像素数量")
plt.show()

为什么这个方法更快?

  • 只生成一个直方图,而非58000个,完全避免了无意义的计算
  • 直接操作numpy数组,绕过了pandas DataFrame的额外封装开销,底层计算更高效

如果一定要用pandas(不推荐)

不要把每个像素设为列,而是把所有像素放到同一列中:

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

hlack_img = Image.open("Henrietta_Lacks.jpg")
hlack_arr = np.array(hlack_img)
if len(hlack_arr.shape) == 3:
    hlack_arr = hlack_arr.mean(axis=2)
pixel_values = hlack_arr.flatten()

# 所有像素作为一列存入DataFrame
hlack_df = pd.DataFrame(pixel_values, columns=["pixel_value"])
hlack_df.hist(bins=256, range=(0, 255))
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:21:02