首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV:如何从背景中删除文本

OpenCV:如何从背景中删除文本
EN

Stack Overflow用户
提问于 2019-10-12 00:05:18
回答 1查看 7K关注 0票数 4

现在,我正在尝试创建一个程序,它从背景中删除文本,但我正在经历许多问题。

我的方法是使用pytesseract来获取文本框,一旦我得到文本框,我就使用cv2.inrow来绘制它并从其中删除文本。简言之:

代码语言:javascript
运行
复制
d = pytesseract.image_to_data(img, output_type=Output.DICT) # Get text
n_boxes = len(d['level']) # get boxes
for i in range(n_boxes): #  Looping through boxes
    # Get coordinates
    (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
    crop_img = img[y:y+h, x:x+w] # Crop image
    gray = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
    gray = inverte(gray) # Inverse it
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1]
    dst = cv2.inpaint(crop_img, thresh, 10, cv2.INPAINT_TELEA) # Then Inpaint
    img[y:y+h, x:x+w] = dst # Place back cropped image back to the source image

现在的问题是,我无法完全删除文本图像:

现在我不知道我还能用什么方法从图像中删除文本,这也是我面临问题的原因。任何帮助都非常感谢。

注意:图像看起来是拉伸的,因为我调整了它的大小以显示屏幕大小。

原始图像:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 00:42:35

下面是一种使用形态学操作+轮廓滤波的方法

将图像转换为grayscale

  • Otsu's阈值以获得二值图像

  • 执行关闭操作,将单词连接到单个轮廓

  • 扩展,以确保所有文本位都包含在轮廓

  • 中,查找轮廓并使用等高线区域

H 111删除文本,方法是“填充”边框中的背景颜色H 212f 213/code>

我使用铬开发工具来确定图像的背景色,即(222,228,251)。如果要动态确定背景色,可以尝试finding the dominant color using k-means。这是结果

代码语言:javascript
运行
复制
import cv2

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

close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, close_kernel, iterations=1)

dilate_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,3))
dilate = cv2.dilate(close, dilate_kernel, iterations=1)

cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 800 and area < 15000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (222,228,251), -1)

cv2.imshow('image', image)
cv2.waitKey()
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58349726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档