如何校正和识别图像中的短文本

时间:2019-05-23 14:51:21

标签: python opencv text-recognition

我正在研究一个文本识别项目,该项目需要从图像中检测和识别文本。 图片中有两行短文字(320像素* 320像素)。第一行是国家/地区代码的缩写。第二行是拨号代码。整个图像可以任意角度旋转。下面是一些示例。

图片一

image one

图片二

image two

图三

image three

因为文本很短,所以像霍夫变换(检测长行),傅立叶变换和轮廓投影之类的方法效果不佳。我正在使用轮廓检测​​来检测文本块的角度。但是,如果文本块为三角形,则无法正常工作。此外,如果文本块为矩形,则在倾斜后,文本将变为上下颠倒,左侧颠倒和右侧颠倒。有人可以建议吗?

file = r"/home/hank/Desktop/af_36.jpg"
image = cv2.imread(os.path.normpath(file))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

blur = cv2.GaussianBlur(gray, (3, 3), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
dilation = cv2.dilate(thresh, kernel, iterations=1)

contours, hierarchy = cv2.findContours(dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contours = [contours[i] for i in range(len(contours)) if
                 not (hierarchy[0][i][3] >= 0 and hierarchy[0][i][2] == -1)]

angles = []

for cnt in contours:
    rect = cv2.minAreaRect(cnt)
    angles.append(rect[2])

angle = sum(angles)/len(angles)

print(angle)

1 个答案:

答案 0 :(得分:0)

如何不检测文本,请尝试检测2个文本(上下)之间的空格。

(1)最简单的方法。

对图像进行阈值处理以找到文本(单词= 1,单词= 0,然后找到阈值框的中心点。中间点x和y应该为空白。

尝试旋转以中点为中心的线(相同长度),宽度jsut很好地触摸顶部和底部文本。具有最大非零像素(意味着线不与文本重叠)的结果为1的结果应该是文本所在的角度。

enter image description here

(2)使用旧的人脸检测路由。 使用类似harr的图案,模板在N旋转角度下匹配。

对于所有x,y和角度的循环

然后逐渐完善。

例如,这是harr功能的angle 0版本。通过模板匹配使它与图像对齐。然后对齐旋转的样式,并在上一个角度模板匹配图像的顶部添加。连接所有模板匹配结果,并运行min-max来找到最高的回报

enter image description here