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

形象一

图片二

图片三

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

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)

最佳答案

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

(1)最ez的方式。

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

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

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

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

对于所有x,y和 Angular 循环

然后逐渐完善。

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

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

关于python - 如何校正和识别图像中的短文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56277865/

10-11 04:01