本文所使用的SVM分类器,功能主要是来分类和识别图片中的特定颜色特征。我用来提取的是图像的荧光特征区域。在训练前,你首先需要有一张需要训练的图和它对应的标签,训练的图可以是
R
G
B
RGB
RGB或者
B
M
P
BMP
BMP图像,标签是一张黑白的二值图,形状与前面图片大小对应,白色区域对应你要提取的原图特征区域。
from sklearn import svm
from PIL import Image
import cv2 as cv
import os
since = time.time()# 时间戳,用来记录时间
image_path = r'图片路径'
label_path = r'标签路径'
image = cv.imread(image_path)
lable1 = cv.imread(label_path)
s = image.shape #获取图片形状信息,一般为(宽,高,3)
s1 = image.reshape(s[0]*s[1],3)#把图片reshape为(像素点数,3)也就是每个像素点rgb值为一行,便于传入分类器训练
lable2 = lable1.flatten()# 把传入的二值图展平成一维作为标签
clf = svm.SVC(gamma='scale')# 开始训练SVM分类器
clf.fit(s1, lable2)print('训练用时:',time.time()-since)#得到训练分类器所需时间defclas_data(file_path,save_path):# 批量预测图片for fileName in os.listdir(file_path):#获取需要预测图片的文件名#if fileName.split("-")[-1] =='2.bmp' or fileName.split("-")[-1] =='2.jpg':
since = time.time()
path = os.path.join(file_path, fileName)# 获得图片路径print(fileName)
img = cv.imread(path)# 打开图片
sp = img.shape # 获取图片形状
s1 = img.reshape(sp[0]*sp[1],3)#reshape,作用和前面一样
predict1 = clf.predict(s1)# 预测图片
a = predict1.reshape(sp[0],sp[1])# 得到预测结果,转为二值图
a = Image.fromarray(a).convert('P')# 此时是pil的‘I’模式,需要转为'P'模式才能显示出来
newFileName = fileName[0:fileName.find(".bmp")]+".png"# 命名图像的后缀改为png格式
a.putpalette([0,0,0,128,0,0])# 输出为(0,1)的标签
a.save(save_path+"\\"+newFileName)# 保存图片到指定路径print('分类用时:',time.time()-since)# 记录分类时间
file_path = r'图片文件夹路径'
save_path = r'保存预测结果路径'
clas_data(file_path,save_path)