这是一个图片分类的简单应用,没有加入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
由于我们没有使别的特征,这个结果还是可以的接受的.主要是对白天大片阴影和晚上有大量亮斑的地方识别不准.