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

