这是一个图片分类的简单应用,没有加入cnn之类的深度学习算法.大致算法如下:
首先 我们先建立一个工具类用于读取图片和归一化图片.
import cv2
import os
'''
resize 图片
'''
def standartize_input(img):
return cv2.resize(img,(244,224))
'''
编辑标签
'''
def encode(label):
numerical_val =0
if label == 'day':
numerical_val = 1
return numerical_val
'''
归一化图片
'''
def standartize(imglist):
standard_list = []
for item in imglist:
img = item[0]
lab = item[1]
std_img = standartize_input(img)
binary_lab = encode(lab)
standard_list.append((std_img,binary_lab))
return standard_list
def load_dataSet(dir,colortype="RGB"):
img_dateSet = []
for i in os.listdir(dir):
path = dir +"/"+i
lable = "night"
img = cv2.imread(path)
if(colortype == 'RGB'):
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
elif(colortype == 'HSV'):
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
if path.__contains__("day"):
lable = "day"
img_dateSet.append((img,lable))
return img_dateSet
接下来我们来测试下:
import imgHelp as help
import matplotlib.pyplot as plt
import numpy as np
'''
# 平均亮度
'''
def avg_brightness(img):
v_img = img[:,:,2]
sum_brightness = np.sum(v_img)
return sum_brightness/(v_img.shape[0]*v_img.shape[1])
'''
# 评估标签
'''
def estimate_label(img):
avg = avg_brightness(img)
threhold = 110 # 设置明暗范围
predict_label = 1
if(avg<threhold):
predict_label = 0
return predict_label
'''
# 收集错误分类
'''
def misclassified_images(test_imges):
misclassified_images = []
for img in test_imges:
current_img = img[0]
true_lab = img[1]
pre_lab = estimate_label(current_img)
if(true_lab!=pre_lab):
misclassified_images.append((current_img,true_lab,pre_lab))
return misclassified_images
img_train_dataSet = help.load_dataSet("./day","HSV") + help.load_dataSet("./night","HSV")
img_test_dataSet = help.load_dataSet("./test","HSV")
stded_train_img_dataSet = help.standartize(img_train_dataSet)
stded_test_img_dataSet = help.standartize(img_test_dataSet)
misclassified_images=misclassified_images(stded_test_img_dataSet)
print("准确率:",1-(len(misclassified_images)/len(img_test_dataSet)))
#print(estimate_label(stded_test_img_dataSet[1][0]))
#print(stded_img_dataSet[0][1])
plt.imshow(misclassified_images[0][0])
#print(stded_test_img_dataSet[1][1])
#print(misclassified_images[1][2])
#print(estimate_label(stded_img_dataSet[11][0]))
plt.show()
准确率: 0.9166666666666666
由于我们没有使别的特征,这个结果还是可以的接受的.主要是对白天大片阴影和晚上有大量亮斑的地方识别不准.