【问题标题】:How to find and crop words into individual images with Python OpenCV?将单词的图像分解成不同的字符图像
【发布时间】:2020-02-11 10:36:27
【问题描述】:

如图所示,我有一个单词的二进制图像,我想用不同图像中的每个字符打破图像。输出应具有 k、7、2、f、5 和 m 的不同图像。我尝试在 python 中使用 opencv,但由于某种原因我无法破解它。如果我也可以在每个文本上绘制一个框,那就足够了。

【问题讨论】:

  • 请考虑参观并阅读帮助中心 (stackoverflow.com/help) 中的信息指南。如果您 (1) 展示自己的一些研究成果,并且 (2) 学习如何在这里提问,用户更有可能提供帮助。请针对您的具体问题提供一个最小、完整且可验证的示例。你都尝试了些什么?请显示您的一些尝试/代码

标签: python opencv machine-learning image-processing


【解决方案1】:

如果您的图像大部分是黑色的,并且字符间隔很好,如您的示例所示,您可以简单地查找仅包含黑色空间的垂直区域。您可以通过首先进行边缘检测来使其更加稳健。但是,如果字距调整导致字符重叠或有噪音,那么问题就非常困难,您需要的帮助比简单的 StackOverflow 答案所能提供的更多。

这是一种进行边缘检测的方法,然后找到垂直间距:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("ZrnKr.png", cv2.IMREAD_GRAYSCALE)
edges = cv2.Canny(img,100,200)
vertical_sum = np.sum(edges, axis=0)
vertical_sum = vertical_sum != 0
changes = np.logical_xor(vertical_sum[1:], vertical_sum[:-1])
change_pts = np.nonzero(changes)[0]

plt.imshow(img)
for change in change_pts:
    plt.axvline(change+1)
plt.show()

【讨论】:

    【解决方案2】:

    这是一个简单的方法:

    • 转换为灰度
    • 大津的门槛
    • 查找轮廓,从左到右对轮廓进行排序,并使用轮廓区域进行过滤
    • 提取投资回报率

    在 Otsu 进行阈值处理以获得二值图像后,我们使用 imutils.contours.sort_contours() 从左到右对轮廓进行排序。这确保了当我们遍历每个轮廓时,每个字符都以正确的顺序排列。此外,我们使用最小阈值区域进行过滤以去除小噪声。这是检测到的字符

    我们可以使用 Numpy 切片提取每个字符。这是每个保存的角色 ROI

    如果你想要其他方式,只需反转它

    ROI = 255 - image[y:y+h, x:x+w]
    

    import cv2
    from imutils import contours
    
    image = cv2.imread('1.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
    
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    cnts, _ = contours.sort_contours(cnts, method="left-to-right")
    
    ROI_number = 0
    for c in cnts:
        area = cv2.contourArea(c)
        if area > 10:
            x,y,w,h = cv2.boundingRect(c)
            ROI = 255 - image[y:y+h, x:x+w]
            cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 1)
            ROI_number += 1
    cv2.imshow('thresh', thresh)
    cv2.imshow('image', image)
    cv2.waitKey()
    

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多