图像像素计数场景下:如何将多组1D NumPy数组合并为单个Pandas DataFrame
解决方法:统一收集计数结果并合并成单个DataFrame
我懂你的问题啦——你现在的循环里每次处理一张图像都会生成独立的counts数组,直接转成DataFrame自然会得到一堆小表,没法整合成统一的大表。咱们换个思路,先把每张图的计数结果整理成带颜色索引的Series,再统一合并,这样就能自动对齐不同的颜色类别,缺失的位置自动用空值填充!
改进后的完整代码
首先把导入语句放在开头(规范写法),然后按以下步骤处理:
import numpy as np import pandas as pd # 假设你的图像数据集已经转成NumPy数组了 data_custom_script = np.array(images) # 创建列表存储每张图像的计数Series count_series_list = [] for idx, img in enumerate(data_custom_script): # 将图像展平为(N, 3)的RGB像素数组,统计每种颜色的出现次数 colours, counts = np.unique(img.reshape(-1, 3), axis=0, return_counts=True) # 把NumPy颜色数组转成元组(因为数组不能作为Pandas索引) colour_keys = [tuple(colour) for colour in colours] # 创建Series:索引是RGB颜色元组,值是计数,名称设为图像编号 img_count_series = pd.Series(counts, index=colour_keys, name=f"Image_{idx+1}") # 将当前图像的计数Series加入列表 count_series_list.append(img_count_series) # 合并所有Series为单个DataFrame,转置后每行对应一张图像 final_df = pd.concat(count_series_list, axis=1).T # 可选:将列名改成更直观的格式(比如Colour_R_G_B) final_df.columns = [f"Colour_{r}_{g}_{b}" for r, g, b in final_df.columns]
代码说明
- 收集Series而非单独数组:用列表存储每张图像的
Series,每个Series的索引是该图像中出现的RGB颜色,值是对应计数,这样不同图像的颜色会自动对齐。 - 自动处理缺失类别:
pd.concat合并时,会把所有出现过的颜色作为列,没有该颜色的图像对应位置自动填充NaN,完全不用手动判断数组形状! - 可选:固定颜色列:如果你预先知道所有可能的颜色类别(比如你提到的最多7种),可以预先定义颜色列表,用
reindex强制对齐:
# 示例:预先定义所有可能的RGB颜色 all_possible_colours = [(0,0,0), (255,255,255), (255,0,0), (0,255,0), (0,0,255), (255,255,0), (255,0,255)] count_series_list = [] for idx, img in enumerate(data_custom_script): colours, counts = np.unique(img.reshape(-1,3), axis=0, return_counts=True) colour_keys = [tuple(c) for c in colours] img_count_series = pd.Series(counts, index=colour_keys) # 强制对齐到预先定义的颜色,缺失的填NaN img_count_series = img_count_series.reindex(all_possible_colours) count_series_list.append(img_count_series) # 直接生成DataFrame,每行对应一张图像,列是预先定义的颜色 final_df = pd.DataFrame(count_series_list, index=[f"Image_{i+1}" for i in range(len(data_custom_script))]) final_df.columns = [f"Colour_{r}_{g}_{b}" for r,g,b in all_possible_colours]
这样处理后,你就能得到一个统一的DataFrame,每行对应一张图像的像素计数,缺失的颜色列自动用空值填充啦!
内容的提问来源于stack exchange,提问作者Sentinel_hub
相关产品推荐
相关产品推荐

