从图像中提取矩形文本框

时间:2019-11-21 16:17:57

标签: python image opencv image-processing computer-vision

我有申请表的图像,我只想提取被文本框包围的名称,DOB,签名和刻度文本框,但是我得到的结果以及其他意外结果。

输入图像:

Input image

预期结果:

expected

我的结果:

result

我尝试了以下代码

isstrprop(str,'digit')

我怎么只能得到预期的结果?

我有申请表的图像,我只想提取被文本框包围的名称,DOB,签名和刻度文本框,但是我得到的结果以及其他意外结果。

1 个答案:

答案 0 :(得分:2)

要提取所需区域,我们可以使用矩形框的属性,因为可以使用轮廓逼近和轮廓区域将它们隔离。这是一种方法:

  • 将图像转换为灰度,模糊和阈值
  • 执行形态学运算以平滑图像并消除噪声
  • 查找轮廓
    • 使用轮廓近似和轮廓面积进行滤波
    • 使用Numpy切片提取并节省ROI

在这里,检测到的矩形文本框以绿色突出显示

enter image description here

由于具有边界框,因此我们只需提取ROI

enter image description here

enter image description here

enter image description here

enter image description here

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
cnts = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    x,y,w,h = cv2.boundingRect(approx)
    if len(approx) == 4 and (area > 1000) and (area < 80000):
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        ROI_number += 1

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.waitKey()