手绘简单黑白图形分类:优化图像预处理与特征提取方法
手绘黑白简单图形分类任务优化方案
任务概况
针对**手绘黑白简单图形(房屋、圆形等)**的分类任务,目前采用SIFT提取特征,结合SVM、AdaBoost、RF等模型,经标准化、类别权重调整(针对"estables"和"evolutivos"类别)后效果未达预期,需优化预处理与特征提取方案。
当前特征提取实现代码
def getData(folder, min_num_descr = 20): lista_imagenes = [] for x in os.listdir(folder): path_local = folder + "/" + x for j in os.listdir(path_local): imagen = cv2.imread(path_local + "/" + j) lista_imagenes.append(imagen) lista_total_kp = [] lista_total_desc = [] lista_total_imagen = [] for i in range(len(lista_imagenes)): sift = cv2.xfeatures2d.SIFT_create() kp_1 = sift.detect(lista_imagenes[i], None) kp_1, dec_1 = sift.compute(lista_imagenes[i],kp_1) lista_total_kp.append(kp_1) lista_total_desc.append(dec_1) lista_total_imagen.append(i) lista_desc_numpy = np.array(lista_total_desc) lista_desc_real = [] for i in range(0,len(lista_total_desc)): try: if lista_total_desc[i].shape[0] >= min_num_descr: lista_desc_real.append(lista_total_desc[i][:min_num_descr]) except: continue return np.array(lista_desc_real)
数据集读取示例:
df_splitted = pd.read_csv("手绘图形特征数据集文件路径").iloc[:,1:]
现存核心问题
- SIFT特征适配性不足:SIFT针对复杂纹理自然图像设计,对简单手绘图形的形状特征捕捉能力有限
- 数据集不平衡:虽已调整类别权重,但未从数据根源缓解该问题
- 预处理缺失针对性:未针对手绘黑白图像的噪声、灰度干扰做专项处理
优化方案
一、针对性图像预处理
先消除手绘图像的干扰因素,提升特征有效性:
- 二值化处理:将灰度图转为纯黑白二值图,突出图形轮廓,消除灰度渐变干扰
# 自适应二值化示例 gray = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY) binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - 去噪处理:用中值滤波去除笔误、扫描噪声,同时保留边缘细节
denoised = cv2.medianBlur(binary, 3) - 尺寸归一化:将所有图像统一缩放至固定尺寸(如64x64),保持图形比例,空白区域填充黑色,避免尺寸差异导致的特征偏差
- 轮廓提取:提取图形的轮廓几何特征(面积、周长、近似多边形顶点数、重心坐标等),作为补充特征
二、替换SIFT的特征提取方案
针对简单手绘图形,推荐以下更适配的特征提取方法:
- ORB特征:开源替代SIFT,速度更快,关键点检测更适配简单形状,代码示例:
orb = cv2.ORB_create(nfeatures=20) # 匹配原代码的min_num_descr参数 kp, desc = orb.detectAndCompute(denoised, None) - HOG特征:方向梯度直方图,专注捕捉图形的边缘与梯度分布,适合形状类识别
hog = cv2.HOGDescriptor() hog_features = hog.compute(denoised) - 像素统计特征:直接提取简单统计特征,如黑白像素占比、水平/垂直像素投影直方图、重心坐标等,实现成本低且适配简单图形
- 轻量级CNN特征:若数据集规模允许,用小型CNN直接学习图像特征,对简单图形分类效果远超传统手工特征,示例结构:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model = Sequential([ Conv2D(16, (3,3), activation='relu', input_shape=(64,64,1)), MaxPooling2D(2,2), Conv2D(32, (3,3), activation='relu'), MaxPooling2D(2,2), Flatten(), Dense(64, activation='relu'), Dense(num_classes, activation='softmax') ])
三、数据与模型补充优化
- 数据增强:对训练集做旋转(±15°)、平移、轻微缩放、镜像翻转等操作,缓解类别不平衡,提升模型泛化能力
- 特征融合:组合多种特征(如HOG+几何特征、CNN特征+手工特征),提升特征表达能力
- 适配模型选择:尝试XGBoost、LightGBM这类对不平衡数据友好的树模型,或配合SMOTE过采样方法进一步处理类别不平衡问题
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

