OCR,裁剪字母

OCR, Cropping the letters

我正在构建一个简单的 OCR,但我遇到了一个问题,即在使用 OpenCV 对字母进行分割后不能裁剪字母。谁能帮我简单地裁剪字母?

这是分段代码。

import cv2
import numpy as np


mser = cv2.MSER_create()
# original image
# -1 loads as-is so if it will be 3 or 4 channel as the original
image = cv2.imread('1.jpg', -1)
# mask defaulting to black for 3-channel and transparent for 4-channel
# (of course replace corners with yours)
mask = np.zeros(image.shape, dtype=np.uint8)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
vis = image.copy()

regions = mser.detectRegions(gray)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]]

channel_count = image.shape[2]  # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,)*channel_count
cv2.fillConvexPoly(mask, hulls, ignore_mask_color)
# from Masterfool: use cv2.fillConvexPoly if you know it's convex
masked_image = cv2.bitwise_and(vis, hulls)
cv2.imwrite('img')

#for m in range(len(hulls)):
    #masked_image = cv2.bitwise_and(vis, ignore_mask_color)
    # save the result
    #cv2.imwrite('img'+m, masked_image)

结果:

我需要使用相同的外壳裁剪每个字母。有帮助吗?

您无法裁剪并直接保存外壳,因为您可以在您发布的示例中看到它们。或者,更好的是,您可以将它们裁剪并粘贴到 square/rectangle canvas 中。但这不是你想要的这个问题的答案。

因此,如果您拥有所有计算机编写的文本,开始的最佳选择是将 cv2.findContours() 应用于图像。您还可以使用其他特定工具,但现在(相对于这个问题)使用这个。

import cv2
import numpy as np

#import image
image = cv2.imread('image.png')

#grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
cv2.waitKey(0)

#binary
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow('second', thresh)
cv2.waitKey(0)

#dilation
kernel = np.ones((1,1), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilated', img_dilation)
cv2.waitKey(0)

#find contours
im2,ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

#sort contours
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

for i, ctr in enumerate(sorted_ctrs):
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)

    # Getting ROI
    roi = image[y:y+h, x:x+w]

    # show ROI
    #cv2.imshow('segment no:'+str(i),roi)
    cv2.rectangle(image,(x,y),( x + w, y + h ),(0,255,0),2)
    #cv2.waitKey(0)

    if w > 15 and h > 15:
        cv2.imwrite('roi{}.png'.format(i), roi)

cv2.imshow('marked areas',image)
cv2.waitKey(0)

您可以调整内核以增加或减少矩形检测的宽度。