如何计算单张图像中多个ROI各自的RGB均值并导出至CSV?
解决RGB图像ROI颜色特征提取与CSV保存问题
问题分析
原代码的核心问题在于ROI分割逻辑错误:逐行扫描像素的方式会把同一建筑的连续像素误判为多个ROI,无法正确识别独立的建筑区域;同时缺少计算RGB整体均值的步骤。
修正方案
使用连通区域分析准确分割每个建筑ROI,再计算每个通道的均值及整体RGB均值,最后保存到CSV。
完整代码
import numpy as np import pandas as pd from skimage import io, measure # 读取图像 image = io.imread("/content/drive/MyDrive/277.png") # 生成二值掩码:筛选非黑像素区域(背景为纯黑) mask = np.any(image > 0, axis=2) # 连通区域分析,标记每个独立ROI label_image = measure.label(mask) roi_mean_values = [] # 遍历每个连通区域 for label in np.unique(label_image): if label == 0: # 跳过背景(标签0对应纯黑区域) continue # 获取当前ROI的掩码 roi_mask = label_image == label # 提取ROI的所有RGB像素 roi_pixels = image[roi_mask] # 计算各通道均值 mean_r = np.mean(roi_pixels[:, 0]) mean_g = np.mean(roi_pixels[:, 1]) mean_b = np.mean(roi_pixels[:, 2]) # 计算RGB整体均值(三个通道均值的平均值) mean_rgb = (mean_r + mean_g + mean_b) / 3 # 收集当前ROI的特征数据 roi_mean_values.append({ 'ROI': label, 'Mean_R': mean_r, 'Mean_G': mean_g, 'Mean_B': mean_b, 'Mean_RGB': mean_rgb }) # 转为DataFrame并保存到CSV roi_mean_df = pd.DataFrame(roi_mean_values) roi_mean_df.to_csv("roi_mean_values.csv", index=False) print("各建筑ROI的RGB颜色特征已保存至 'roi_mean_values.csv'。")
代码说明
- 连通区域分析:
measure.label会将图像中连通的非黑区域标记为不同标签,确保每个独立建筑被识别为一个完整ROI。 - 掩码提取ROI:通过标签掩码精准提取对应ROI的所有像素,彻底避免原代码的误分割问题。
- 颜色特征计算:分别计算R、G、B单通道均值,再通过三个通道均值的平均得到RGB整体均值,满足需求中的四个特征值。
- CSV保存:将所有ROI的特征整理为结构化DataFrame,保存为无索引的CSV文件,便于后续分析。
注意事项
- 确保图像背景为严格纯黑(像素值全为0),若存在灰度噪声,可添加
skimage.morphology.remove_small_objects处理掩码,去除小噪声区域。 - 若图像为8位深度(像素值0-255),计算得到的均值为浮点型,可根据需求用
int()转换为整数。
内容的提问来源于stack exchange,提问作者Asim Shoaib
相关产品推荐
相关产品推荐

