我试图从opencv图像中分别提取字母,但是在某些情况下遇到困难。有时,他会捡起相同的字母并在中间分开。在某些情况下,例如字母“ i”,它无法识别该点并将其视为另一个字符。在应用腐蚀功能并搜索轮廓以提取字母之后,下面有3个输入图像示例。
我的代码段:
import cv2
import numpy as np
import imutils
img = cv2.imread('captchas/image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1]
kernel = np.ones((5,4), np.uint8)
img_erode = cv2.erode(thresh, kernel, iterations = 1)
contours = cv2.findContours(img_erode.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
contours = contours[0] if imutils.is_cv2() else contours[1]
letter_image_regions = []
output = img_erode.copy()
for contour in contours:
(x, y, w, h) = cv2.boundingRect(contour)
if cv2.contourArea(contour) > 200:
if w / h > 0.75:
half_width = int(w / 2)
cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3)
cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)
else:
cv2.rectangle(output, (x, y), (x + w, y + h), (70,0,70), 3)
cv2.imshow("Input", img)
cv2.imshow("Erode", img_erode)
cv2.imshow("Output", image)
cv2.waitKey(0)
答案 0 :(得分:0)
字母Z
被分隔一半的原因是这种情况if w / h > 0.75:
,而您绘制cv2.rectangle(output, (x, y), (x + half_width, y + h), (70,0,70), 3)
。因此,尝试找到更好的条件。
要获取整个字母i
,请在morphologyEx()
之后和erode()
之前执行findContour()
。
kernel2 = np.ones((22,7), np.uint8)
morph_img = img_erode.copy()
cv2.morphologyEx(src=img_erode, op=cv2.MORPH_CLOSE, kernel=kernel2, dst=morph_img)
结果我得到了。您可以调整kernel2
的大小以获得更好的效果。