如何将提取的图像Hu矩特征作为单行存入Pandas DataFrame
问题原因分析
- 缩进错误:原代码中向DataFrame追加数据的逻辑被放在了遍历单张图像的内层循环之外,遍历同一个类别下的所有图像时,存储特征的变量会被反复覆盖,最终仅会保留每个类别下最后一张图像的特征
- 数据格式传入错误:调用append方法时传入一维列表,pandas会默认将列表的每个元素作为单独行存入同一列,不会识别为单行多列数据
- 冗余代码:原代码内层循环中定义的空DataFrame变量没有实际作用,属于冗余逻辑
修改方案
建议先将所有图像的Hu矩特征存入临时列表,最后一次性转为DataFrame,避免循环中频繁调用append带来的性能损耗,修改后完整代码如下:
import numpy as np import cv2 import os import pandas as pd data_path = "/content/drive/My Drive/ADIP/seperate_ricepests6/seperate_ricepests6/" # 先定义临时列表存储所有图像的Hu矩特征 hu_features = [] labels = os.listdir(data_path) for dirname in labels: filepath = os.path.join(data_path, dirname) print("Extracting ", dirname, " ... ") for file in os.listdir(filepath): filename = os.path.join(filepath, file) image = cv2.imread(filename) image_resized = cv2.resize(image, (300,300)) image_gray = cv2.cvtColor(image_resized, cv2.COLOR_BGR2GRAY) # 提取7维Hu矩特征 image_hu = cv2.HuMoments(cv2.moments(image_gray)).flatten() # 将当前图像的特征作为子列表加入总特征列表 hu_features.append(image_hu.tolist()) print(dirname, "ok!") # 一次性将总特征列表转为DataFrame,支持自定义列名 image_Humoment = pd.DataFrame(hu_features, columns=[f'hu_{i+1}' for i in range(7)])
效果验证
最终得到的image_Humoment行数等于所有图像总数量,共7列,每列对应一个Hu矩特征值。如果需要同时存储图像对应的类别标签,可在提取特征时同步把类别名加入列表,转为DataFrame时增加对应列即可。
内容的提问来源于stack exchange,提问作者Qasim0787
相关产品推荐
相关产品推荐

