改进文本区域检测(OpenCV,Python)

时间:2017-09-07 21:31:29

标签: python opencv computer-vision bounding-box mser

我正在开展一个项目,要求我检测图像中的文本区域。这是我到目前为止使用下面的代码实现的结果。

原始图片 original

结果 Result

代码如下:

const update = (state, mutations) =>
  Object.assign({}, state, mutations);

router.get('/:id', (req, res) => {
  let exercise = exercises.items[req.params.id];
  if (exercise.string.constructor === Array) {
    exercise = update(exercise, { string: exerciseGenerator(exercise.string) });
  }
  res.json({ api: exercise });
});

正如您所看到的,这可以做得比我需要的更多。如果您需要更多,请查找注释部分。

顺便说一下,我需要的是将每个文本区域绑定在一个矩形中,而不是(靠近)脚本找到的每个字符。过滤单个数字或字母,并将所有内容都整理在一个方框中。

例如,框中的第一个序列,另一个中的第二个序列,依此类推。

我搜索了一下,我发现了一些关于"过滤矩形区域&#​​34;。我不知道它对我的目的是否有用。

还看了一下谷歌的第一个结果,但大多数都不能很好地运作。我想代码需要稍微调整一下,但我是OpenCV世界的新手。

1 个答案:

答案 0 :(得分:8)

使用以下代码解决。

import cv2

# Load the image
img = cv2.imread('image.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# smooth the image to avoid noises
gray = cv2.medianBlur(gray,5)

# Apply adaptive threshold
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
thresh_color = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)

# apply some dilation and erosion to join the gaps - change iteration to detect more or less area's
thresh = cv2.dilate(thresh,None,iterations = 15)
thresh = cv2.erode(thresh,None,iterations = 15)

# Find the contours
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# For each contour, find the bounding rectangle and draw it
for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.rectangle(thresh_color,(x,y),(x+w,y+h),(0,255,0),2)

# Finally show the image
cv2.imshow('img',img)
cv2.imshow('res',thresh_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

需要修改以获得以下结果的参数是erodedilate函数中的迭代次数。 较低的值将在(几乎)每个数字/字符周围创建更多的边界矩形。

<强>结果

result