Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)

82 篇文章 20 订阅
本文介绍了使用Python和OpenCV实现的手写数字和英文字母的OCR技术,通过KNN算法分别对手写数据进行分类,并计算了高精度的识别率。后续还展示了如何预处理数据、训练模型以及保存和加载数据的过程。
摘要由CSDN通过智能技术生成

Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)

OCR of Hand-written Digits

####################################################################################################
# 基于KNN手写数据OCR(OCR of Hand-written Data using kNN)
def lmc_cv_knn_ocr():
    """
        函数功能: 基于KNN手写数据OCR(OCR of Hand-written Data using kNN).
    """

    # 读取图像
    image = lmc_cv.imread('D:/99-Research/TestData/image/digits.png')
    gray_image = lmc_cv.cvtColor(image, lmc_cv.COLOR_BGR2GRAY)

    # Now we split the image to 2500 cells, each 20x20 size
    cells = [np.hsplit(row, 50) for row in np.vsplit(gray_image, 50)]

    # Make it into a Numpy array: its size will be (50,50,20,20)
    x = np.array(cells)

    # Now we prepare the training data and test data
    train = x[:, :25].reshape(-1, 400).astype(np.float32)  # Size = (1250,400)
    test = x[:, 25:50].reshape(-1, 400).astype(np.float32)  # Size = (1250,400)

    # Create labels for train and test data
    k = np.arange(10)
    train_labels = np.repeat(k, 125)[:, np.newaxis]
    test_labels = train_labels.copy()

    # Initiate kNN, train it on the training data, then test it with the test data with k=1
    knn = lmc_cv.ml.KNearest_create()
    knn.train(train, lmc_cv.ml.ROW_SAMPLE, train_labels)
    ret, result, neighbours, dist = knn.findNearest(test, k=5)

    # Now we check the accuracy of classification.
    # For that, compare the result with test_labels and check which are wrong.
    matches = result == test_labels
    correct = np.count_nonzero(matches)
    accuracy = correct * 100.0 / result.size
    print("accuracy:  {}\n".format(accuracy))

    # Instead of finding this training data every time I start the application, I better save it.
    # so that the next time, I can directly read this data from a file and start classification.
    # Save the data
    np.savez('knn_data.npz', train=train, train_labels=train_labels)

    # Now load the data
    with np.load('knn_data.npz') as data:
        print("data.files:  {}\n".format(data.files))
        train = data['train']
        train_labels = data['train_labels']

【结果】
accuracy:  88.72
data.files:  ['train', 'train_labels']

OCR of the English Alphabet

####################################################################################################
# 基于KNN英文字母OCR(OCR of English Alphabet Data using kNN)
def lmc_cv_knn_ocr_english_alphabet():
    """
        函数功能: 基于KNN英文字母OCR(OCR of English Alphabet Data using kNN).
    """

    # Load the data and convert the letters to numbers
    data = np.loadtxt('D:/99-Research/TestData/image/letter-recognition.data', dtype='float32', delimiter=',',
                      converters={0: lambda ch: ord(ch) - ord('A')})

    # Split the dataset in two, with 10000 samples each for training and test sets
    train, test = np.vsplit(data, 2)

    # Split trainData and testData into features and responses
    responses, train_data = np.hsplit(train, [1])
    labels, test_data = np.hsplit(test, [1])

    # Initiate the kNN, classify, measure accuracy
    knn = lmc_cv.ml.KNearest_create()
    knn.train(train_data, lmc_cv.ml.ROW_SAMPLE, responses)
    ret, result, neighbours, dist = knn.findNearest(test_data, k=5)
    correct = np.count_nonzero(result == labels)
    accuracy = correct * 100.0 / 10000
    print("accuracy:  {}\n".format(accuracy))
【结果】
accuracy:  93.06

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值