作者:凡秘能 | 来源:互联网 | 2023-10-11 15:52
图像识别概念图像识别是识别图像中物体的类别(属于哪一个类)的任务。图像识别通常被称为ImageClassification、Categorization、Clustering。卷积
图像识别概念
图像识别是识别图像中物体的类别(属于哪一个类)的任务。图像识别通常被称为Image Classification、Categorization、Clustering。
卷积神经网络(CNN)出现之前,一般用HOG、SIFT、SURF等方法先从图像中提取特征,然后通过特征确定物体的类别。
利用图像直方图实现简单的图像识别任务
算法流程:
- 将训练集中的图像进行减色处理(图像色彩量化:图像色彩量化详解)。RGB每个分量都只取4个值。
- 创建训练集减色图像的直方图。RGB图像的直方图中,B=[1,4],G=[5,8]、R=[9,12],此时bin=12,但是我还需要保留每张训练图所属的类别,所以,bin=13。数据这样存储:database = np.zeros( (训练数据数,13),dtype=np.int )。所有训练数据的柱状图如下:
database具有如下的形状和内容(每一行最后一列是图像所属的类别):
- 将测试集图像进行色彩量化,计算测试集图像的直方图与训练集中每个直方图的差,将差称作特征向量。
- 直方图差异总和最小的训练集中图像的类别就是我们预测的待测图像的类别。换句话说,待测图像的类别与近色图像一致。
实验代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
def dic_color(img):img //= 63img = img * 64 + 32return img
def get_DB():train = glob("../dataset/train/*")train.sort()db = np.zeros((len(train), 13), dtype=np.int32)pdb = []for i, path in enumerate(train):img = dic_color(cv2.imread(path))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])if 'akahara' in path:cls = 0elif 'madara' in path:cls = 1db[i, -1] = clspdb.append(path)return db, pdb
def test_DB(db, pdb):test = glob("../dataset/test/*")test.sort()accurate_N = 0.for path in test:img = dic_color(cv2.imread(path))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])difs = np.abs(db[:, :12] - hist)difs = np.sum(difs, axis=1)pred_i = np.argmin(difs)pred = db[pred_i, -1]if pred == 0:pred_label = "akahara"elif pred == 1:pred_label = "madara"gt = "akahara" if "akahara" in path else "madara"if gt == pred_label:accurate_N += 1print(path, "is similar >>", pdb[pred_i], " Pred >>", pred_label)accuracy = accurate_N / len(test)print("Accuracy >>", accuracy, "({}/{})".format(int(accurate_N), len(test)))if __name__ == '__main__':db, pdb = get_DB()test_DB(db, pdb)
实验输出(包含识别出的图像的类别和识别准确率):