如何倾斜和识别图像中的短文本

2024-04-25 20:50:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

形象一

image one

图像二

image two

图像三

image three

由于文本很短,像hough变换(检测长线)、fourier变换和轮廓投影等方法不能很好地实现。我使用轮廓检测来检测文本块的角度。但是,如果文本块是三角形的,则不能很好地工作。另外,如果文本块是矩形的,反扭曲后的文本将变成上下、左下和右下。有人能建议一下吗?在

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)

Tags: 代码图像image文本hierarchycv2file轮廓
1条回答
网友
1楼 · 发布于 2024-04-25 20:50:32

不如不检测文本,试着检测两个文本之间的间隔(上下)。在

(1)最ez路。在

设置图像的阈值以查找文本(word=1而word=0。然后找到这个盒子的中心点。中间点x和y应该是空白。在

试着旋转一条以中间点为中心的线(长度相同),宽度jsut会很好地接触顶部和底部的文本。最大非零像素数(表示线条与文本不重叠)为1的结果应为文本所在的角度。在

enter image description here

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

所有x,y,角度的For循环

然后逐步完善。在

例如,这是0角版的harr功能。通过模板匹配将其与图像对齐。然后对齐旋转的图案,在上一个角度模板上加上匹配图像。连接所有模板匹配结果并运行最小-最大值以找到最高的回报

enter image description here

相关问题 更多 >