关于CV2的图形与数字识别

img


分别识别九个格子里面的数字和图形,输出格式为‘序号+数字+图形’,如‘1+2+三角形’
我采用了模板匹配的方法,对图像进行了切割、灰度处理与二值化的预处理,结果非常不理想。
有什么办法可以增加识别的准确度?是否可以把数字与图形分开识别?
希望可以有代码参考

该回答引用GPTᴼᴾᴱᴺᴬᴵ
增加识别准确度的方法可以包括:

  1. 使用更高级的图像处理技术,例如边缘检测、图像分割、特征提取等,可以提取更多的有效信息来进行识别。

  2. 使用深度学习方法,例如卷积神经网络(CNN)、循环神经网络(RNN)等,可以根据大量的数据进行训练,以提高识别准确度。

  3. 对图像进行更好的预处理,例如去噪、直方图均衡化、滤波等,可以提高图像的质量,进而提高识别准确度。

  4. 将数字和图形分开识别,可以分别对数字和图形进行分类,进而提高识别准确度。

以下是一个数字和图形分开识别的示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 对图像进行二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 对图像进行形态学处理,填充空洞
kernel = np.ones((5,5),np.uint8)
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# 对图像进行轮廓检测
contours, hierarchy = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 对每个轮廓进行处理
for i in range(len(contours)):
    # 获取轮廓的边界框
    x, y, w, h = cv2.boundingRect(contours[i])
    
    # 如果边界框太小,则认为不是数字或图形
    if w < 10 or h < 10:
        continue
    
    # 对数字和图形分别进行识别
    if w > h:  # 数字
        # 对数字进行裁剪,并调整大小
        digit = thresh[y:y+h, x:x+w]
        digit = cv2.resize(digit, (28, 28))
        
        # 使用训练好的模型进行预测
        digit = digit.reshape((1, 28, 28, 1))
        digit = digit.astype('float32') / 255
        result = model_digit.predict(digit)
        digit_num = np.argmax(result)
        
        # 输出结果
        print(str(i+1) + '+' + str(digit_num))
        
    else:  # 图形
        # 对图形进行裁剪,并调整大小
        shape = thresh[y:y+h, x:x+w]
        shape = cv2.resize(shape, (32, 32))
        
        # 使用模板匹配进行识别
        result = []
        for template in templates:
            res = cv2.matchTemplate(shape, template, cv2.TM_CCOEFF_NORMED)
            result.append(res)
        shape_type = np.argmax(result)
        
        # 输出结果
       


结果非常不理想:你没有说清楚是预处理结果不理想,还是识别结果不理想。
对图像进行了切割、灰度处理与二值化的预处理:这是预处理,预处理之后的 9张子图,其中的图形形状和数字,清晰吗?
图形和数字的识别:使用模板匹配的方法是不可行的,模板匹配其实是相同(高度相似)图像的检索,不能用于识别。
如何识别,比较稳定的方法当然是神经网络/深度学习。但也取决于你的问题,具体问题仅是对图中图形/数字给出结果,还是要解决一类问题?
如果是后者,必须有自动识别图形、数字的算法,例如深度学习。如果是前者,图形其实只有两类,数字也只有几个,可以用一些先验知识来解决。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^