如何用Python可视化大规模图像数据集并展示其颜色分布
Python图像数据集可视化及颜色分布直方图实现
必备依赖
先安装需要的库:
pip install pillow matplotlib numpy
单张图像的颜色直方图
先从单张图入手,理解颜色分布的统计逻辑:
from PIL import Image import matplotlib.pyplot as plt import numpy as np # 读取图像 img = Image.open("sample_image.jpg") # 转换为RGB模式(避免灰度图或其他模式报错) img_rgb = img.convert("RGB") # 提取RGB通道数据 r, g, b = img_rgb.split() # 计算每个通道的直方图(bins=256对应0-255的像素值范围) r_hist = np.histogram(r, bins=256, range=(0, 256)) g_hist = np.histogram(g, bins=256, range=(0, 256)) b_hist = np.histogram(b, bins=256, range=(0, 256)) # 绘制直方图 plt.figure(figsize=(12, 6)) plt.plot(r_hist[1][:-1], r_hist[0], color='red', alpha=0.7, label='Red') plt.plot(g_hist[1][:-1], g_hist[0], color='green', alpha=0.7, label='Green') plt.plot(b_hist[1][:-1], b_hist[0], color='blue', alpha=0.7, label='Blue') plt.title("单张图像RGB颜色分布直方图") plt.xlabel("像素值") plt.ylabel("像素数量") plt.legend() plt.show()
整数据集的颜色分布统计
要统计整个数据集的颜色分布,需要遍历所有图像,累加每个通道的像素计数:
import os from PIL import Image import matplotlib.pyplot as plt import numpy as np # 数据集路径 dataset_dir = "your_dataset_path" # 初始化三个通道的直方图计数器 total_r = np.zeros(256) total_g = np.zeros(256) total_b = np.zeros(256) # 遍历数据集所有图像 for filename in os.listdir(dataset_dir): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): img_path = os.path.join(dataset_dir, filename) img = Image.open(img_path).convert("RGB") r, g, b = img.split() # 统计当前图像的直方图并累加 r_counts = np.histogram(r, bins=256, range=(0, 256))[0] g_counts = np.histogram(g, bins=256, range=(0, 256))[0] b_counts = np.histogram(b, bins=256, range=(0, 256))[0] total_r += r_counts total_g += g_counts total_b += b_counts # 绘制整个数据集的颜色分布直方图 plt.figure(figsize=(12, 6)) plt.plot(range(256), total_r, color='red', alpha=0.7, label='Red Channel') plt.plot(range(256), total_g, color='green', alpha=0.7, label='Green Channel') plt.plot(range(256), total_b, color='blue', alpha=0.7, label='Blue Channel') plt.title("整个图像数据集RGB颜色分布直方图") plt.xlabel("像素值") plt.ylabel("总像素数量") plt.legend() plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
进阶优化
- 归一化处理:如果数据集图像数量/尺寸差异大,可以将直方图除以总像素数,得到比例分布:
total_pixels = total_r.sum() norm_r = total_r / total_pixels norm_g = total_g / total_pixels norm_b = total_b / total_pixels # 后续绘制用norm_r、norm_g、norm_b即可 - 堆叠直方图:用
plt.bar绘制堆叠效果,更直观展示各通道占比:plt.figure(figsize=(12, 6)) x = range(256) plt.bar(x, total_r, color='red', alpha=0.5) plt.bar(x, total_g, bottom=total_r, color='green', alpha=0.5) plt.bar(x, total_b, bottom=total_r+total_g, color='blue', alpha=0.5) plt.title("数据集RGB颜色分布堆叠直方图") plt.xlabel("像素值") plt.ylabel("总像素数量") plt.legend(['Red', 'Green', 'Blue']) plt.show() - 处理灰度图:如果数据集中有灰度图,可以在转换时判断,将灰度值同时加到三个通道(或单独统计灰度分布)。
内容的提问来源于stack exchange,提问作者Avantika Saklani
相关产品推荐
相关产品推荐

