文章目录基于统计特征与机器学习的图像过暗检测系统一、项目背景二、项目目标三、核心方法四、文件架构五、项目实战 ——逻辑回归模型的自训练与预测1批量提取图像特征generate_csv.py2训练模型并保存train_model.py3离线图像检测detect_image.py4打包为独立可执行程序基于统计特征与机器学习的图像过暗检测系统一、项目背景在工业显微成像、材料分析与图像采集流程中图像质量直接影响后续任务的稳定性与准确性。尤其在扫描电子显微镜SEM、光学检测、图像建模等场景中图像过暗或灰度分布过窄是最常见的质量问题之一。传统依赖人工目测的质量筛查方式存在主观性强、效率低、无法批量化等问题亟需构建自动化图像异常检测系统提升图像采集流程的智能化水平。二、项目目标本项目旨在构建一套轻量级图像过暗自动检测工具可实现对任意输入图像进行过暗与灰度异常分析支持离线/边缘设备快速部署提供统计分析与机器学习融合判定支持训练与预测模块解耦满足不同平台灵活调用。三、核心方法本系统采用“统计特征提取 机器学习判别”的组合策略。检测逻辑如下图所示图像输入 → 特征提取均值/方差/熵/低灰度比例 → 训练/预测 → 异常判定结果特征提取灰度均值mean反映亮度水平标准差std衡量对比度信息熵entropy度量图像细节丰富度暗像素比例dark_ratio低灰度区域占比检测模型训练阶段使用Logistic回归进行学习支持拓展至LightGBM、SVM等更复杂模型模型训练与调用完全分离支持离线推理。四、文件架构模块功能说明特征提取模块自动从灰度图中提取亮度/对比度/信息熵等指标模型训练模块使用已标注数据构建判别模型支持CSV输入模型预测模块输入任意图像输出“是否过暗”检测结果离线部署支持训练模型保存为.joblib可在任意平台加载运行image_detector/├── train_model.py# 训练模型并保存为.joblib├── detect_image.py# 加载模型检测单张图像├── logistic_dark_detector.joblib# 模型文件由train_model.py生成├── image_quality_dataset.csv# 训练数据集手动构建├── dataset/│ ├── normal/# 正常图像可选用于提取特征│ └── abnormal/# 异常图像可选类型数量建议数据来源建议正常图像≥50张拍摄良好的高质量SEM图像异常图像≥50张多种异常样本各采样10~20张五、项目实战 ——逻辑回归模型的自训练与预测1批量提取图像特征generate_csv.pyimportosimportcv2importnumpyasnpimportpandasaspdfromskimage.measureimportshannon_entropyfromtqdmimporttqdmdefextract_features(img): 提取图像灰度特征 meanround(float(np.mean(img)),2)stdround(float(np.std(img)),2)entropyround(float(shannon_entropy(img)),2)dark_ratioround(float(np.sum(img60)/img.size),4)returnmean,std,entropy,dark_ratiodefprocess_folder(folder_path,label): 扫描目录下所有图像提取特征并打上标签 data[]forfilenameintqdm(os.listdir(folder_path),descf处理{folder_path}):ifnotfilename.lower().endswith((.jpg,.png,.jpeg,.tif)):continuefull_pathos.path.join(folder_path,filename)imgcv2.imread(full_path,cv2.IMREAD_GRAYSCALE)ifimgisNone:continuemean,std,entropy,dark_ratioextract_features(img)data.append([filename,mean,std,entropy,dark_ratio,label])returndatadefmain():base_dirdataset# 图像总目录output_csvimage_quality_dataset.csvnormal_pathos.path.join(base_dir,normal)abnormal_pathos.path.join(base_dir,abnormal)all_data[]all_data.extend(process_folder(normal_path,label0))all_data.extend(process_folder(abnormal_path,label1))dfpd.DataFrame(all_data,columns[filename,mean,std,entropy,dark_ratio,label])df.to_csv(output_csv,indexFalse,encodingutf-8)print(f特征提取完毕已保存至{output_csv})if__name____main__:main()2训练模型并保存train_model.py# train_model.pyimportpandasaspdfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportclassification_reportfromjoblibimportdump# 1. 构造自定义训练数据集 data{mean:[112.1,128.3,94.6,119.8,106.2,101.4,74.1,88.6,62.3,80.4,69.0,85.5],std:[65.6,72.4,51.7,66.0,58.5,60.1,21.5,24.9,19.8,25.1,20.2,27.3],entropy:[7.25,7.68,6.91,7.31,6.82,6.95,3.91,4.12,3.57,4.25,3.61,4.02],dark_ratio:[0.2322,0.1520,0.3401,0.1805,0.2650,0.2900,0.9102,0.8053,0.9448,0.8510,0.9305,0.8721],label:[0,0,0,0,0,0,1,1,1,1,1,1]}# label0表示正常1表示异常dfpd.DataFrame(data)Xdf[[mean,std,entropy,dark_ratio]]ydf[label]# 2. 读取自定义训练数据集 # # 读取训练数据自行构建 image_quality_dataset.csv# df pd.read_csv(image_quality_dataset.csv)# # 特征和标签# X df[[mean, std, entropy, dark_ratio]].values# y df[label].values########################################################################################## 划分数据集并训练X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)modelLogisticRegression()model.fit(X_train,y_train)# 打印结果并保存模型y_predmodel.predict(X_test)print(模型评估\n,classification_report(y_test,y_pred))dump(model,logistic_dark_detector.joblib)print(模型已保存为 logistic_dark_detector.joblib)3离线图像检测detect_image.py# detect_image.pyimportcv2importnumpyasnpfromskimage.measureimportshannon_entropyfromjoblibimportloadimportsysimportosdefextract_features(img):meanround(float(np.mean(img)),2)stdround(float(np.std(img)),2)entropyround(float(shannon_entropy(img)),2)dark_ratioround(float(np.sum(img60)/img.size),4)return[mean,std,entropy,dark_ratio]defmain(img_path):ifnotos.path.exists(img_path):print(图像路径不存在)return# 加载图像与模型imgcv2.imread(img_path,cv2.IMREAD_GRAYSCALE)modelload(logistic_dark_detector.joblib)featuresextract_features(img)# 预测predmodel.predict([features])[0]print(图像检测结果,异常过暗ifpred1else正常)print(图像特征值,features)if__name____main__:pathrD:\py\BC\25052757812\demo\1-01\b_0.0_and_c_1.1.tifmain(path)4打包为独立可执行程序pip install pyinstaller pyinstaller-F detect_image.py打包后将在dist/目录下生成一个detect_image.exe或无扩展名的可执行文件可以在没有Python环境的电脑上直接运行。