import cv2
import os
import numpy as np
from sklearn import svm
from sklearn import neighbors
from sklearn.neural_network import MLPClassifier


# 垂直投影,分割字符
def verticle_projection(thresh1):
    h, w = thresh1.shape[:]
    a = [0] * w
    for j in range(w):
        for i in range(h):
            if thresh1[i, j] == 0:
                a[j] += 1
                thresh1[i, j] = 255
    
    for j in range(w):
        for i in range(h - a[j], h):
            thresh1[i, j] = 0
    roi_list = []
    start_index = 0
    end_index = 0
    in_block = False
    for i in range(w):
        if in_block == False and a[i] != 0:
            in_block = True
            start_index = i
        elif a[i] == 1 and in_block:
            end_index = i
            in_block = False
        roiImg = thresh1[:h, start_index: end_index + 1]
        roi_list.append(roiImg)
    return roi_list

# 提取网格特征
def get_features(array):
    h, w = array.shape[:]
    data = []
    for x in range(w // 4):
        offset_y = x * 4
        temp = []
        for y in range(h // 4):
            offset_x = y * 4
            sum_temp = array[0 + offset_y: 4 + offset_y, 0 + offset_x: 4 + offset_x]
            temp.append(sum(sum(sum_temp)))
        data.append(temp)
    return np.asarray(data)


def train():
    train_path = './dataset/train/'
    train_files = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    train_X = []
    train_Y = []
    for train_file in train_files:
        pictures = os.listdir(train_path + train_file)
        for picture in pictures:
            img = cv2.imread(train_path + train_file + '/' + picture)
            img = cv2.resize(img, (32, 32), cv2.INTER_CUBIC)
            gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            ret, threshold = cv2.threshold(gray_img, 130, 255, cv2.THRESH_BINARY)
            feature = get_features(threshold)
            feature = feature.reshape(feature.shape[0] * feature.shape[1])
            train_X.append(feature)
            train_Y.append(train_file)
    train_X = np.array(train_X)
    train_Y = np.array(train_Y)
    # svm
    linearsvc_clf = svm.LinearSVC()
    linearsvc_clf.fit(train_X, train_Y)
    # knn
    knn_clf = neighbors.KNeighborsClassifier()
    knn_clf.fit(train_X, train_Y)
    # mlp
    mlp_clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(32, 32), random_state=1)
    mlp_clf.fit(train_X, train_Y)
    return linearsvc_clf


def test_main(linearsvc_clf):
    img = cv2.imread('')
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, threshold = cv2.threshold(gray_img, 130, 255, cv2.THRESH_BINARY)
    roi_list = verticle_projection(threshold)  
    test_X = []
    for single in roi_list:
        single = cv2.resize(single, (32, 32),  cv2.INTER_CUBIC)
        feature = get_features(single)
        feature = feature.reshape(feature.shape[0] * feature.shape[1])
        test_X.append(feature)
    test_X = np.asarray(test_X)
    result = linearsvc_clf.predict(test_X)
    return result


if __name__ == '__main__':
    linearsvc_clf = train()
    test_main(linearsvc_clf)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐