简单图像识别第二步:判别类别
在这里我们完成上一节算法的4至5步。
请使用测试数据集testakahara@@@.jpg
和testmadara@@@.jpg
(共计4张)。请输出与各个图像直方图差别最小的(训练数据集的)文件名和预测类别。这种评价方法被称为最近邻法(Neareset Neighbour)。
test_akahara_1.jpg:
test_akahara_2.jpg:
test_madara_1.jpg:
test_madara_2.jpg:
python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
# Dicrease color
def dic_color(img):
img //= 63
img = img * 64 + 32
return img
# Database
def get_DB():
# get training image path
train = glob("dataset/train_*")
train.sort()
# prepare database
db = np.zeros((len(train), 13), dtype=np.int32)
# prepare path database
pdb = []
# each image
for i, path in enumerate(train):
# read image
img = dic_color(cv2.imread(path))
#get histogram
for j in range(4):
db[i, j] = len(np.where(img[..., 0] == (64 * j + 32))[0])
db[i, j+4] = len(np.where(img[..., 1] == (64 * j + 32))[0])
db[i, j+8] = len(np.where(img[..., 2] == (64 * j + 32))[0])
# get class
if 'akahara' in path:
cls = 0
elif 'madara' in path:
cls = 1
# store class label
db[i, -1] = cls
# store image path
pdb.append(path)
return db, pdb
# test
def test_DB(db, pdb):
# get test image path
test = glob("dataset/test_*")
test.sort()
success_num = 0.
# each image
for path in test:
# read image
img = dic_color(cv2.imread(path))
# get histogram
hist = np.zeros(12, dtype=np.int32)
for j in range(4):
hist[j] = len(np.where(img[..., 0] == (64 * j + 32))[0])
hist[j+4] = len(np.where(img[..., 1] == (64 * j + 32))[0])
hist[j+8] = len(np.where(img[..., 2] == (64 * j + 32))[0])
# get histogram difference
difs = np.abs(db[:, :12] - hist)
difs = np.sum(difs, axis=1)
# get argmin of difference
pred_i = np.argmin(difs)
# get prediction label
pred = db[pred_i, -1]
if pred == 0:
pl = "akahara"
elif pred == 1:
pl = "madara"
print(path, "is similar >>", pdb[pred_i], " Pred >>", pl)
db, pdb = get_DB()
test_DB(db, pdb)
答案如下:
test_akahara_1.jpg is similar >> train_akahara_3.jpg Pred >> akahara
test_akahara_2.jpg is similar >> train_akahara_1.jpg Pred >> akahara
test_madara_1.jpg is similar >> train_madara_2.jpg Pred >> madara
test_madara_2.jpg is similar >> train_akahara_2.jpg Pred >> akahara