首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从图像中删除带有黑色边框的白色文本

从图像中删除带有黑色边框的白色文本
EN

Stack Overflow用户
提问于 2020-09-21 05:22:02
回答 2查看 859关注 0票数 0

我试图从图像中删除带有白色填充的黑色边框的文本。以下面的图片为例。

我已经尝试了几种使用opencv和skimage在油漆中的选择。

代码语言:javascript
运行
复制
import cv2
from skimage.restoration import inpaint
img = cv2.imread('Documents/test_image.png')
mask = cv2.threshold(img, 210, 255, cv2.THRESH_BINARY)[1][:,:,0]
dst = cv2.inpaint(img, mask, 7, cv2.INPAINT_TELEA)
image_result = inpaint.inpaint_biharmonic(img, mask,
                                          multichannel=True)
cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('dst',dst)
cv2.imshow('image_result',image_result)
cv2.waitKey(0)

似乎修复只是试图填充黑色,因为这是它所认定的周围感兴趣的领域。我想要做的是完全删除白色文本和黑色边框,或者第二次尝试用更多来自周围颜色的信息填充白色,而不仅仅是黑色。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-21 18:21:50

下面是Python/OpenCV中的两种修补方法。注意,我使用饱和通道来创建阈值,因为白色和黑色原则上都是零饱和的。

输入:

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

# read input
img = cv2.imread('white_black_text.png')

# convert to hsv and extract saturation
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
sat = hsv[:,:,1]

# threshold and invert
thresh = cv2.threshold(sat, 10, 255, cv2.THRESH_BINARY)[1]
thresh = 255 - thresh

# apply morphology dilate
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15,15))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_DILATE, kernel)

# do inpainting
result1 = cv2.inpaint(img,thresh,11,cv2.INPAINT_TELEA)
result2 = cv2.inpaint(img,thresh,11,cv2.INPAINT_NS)

# save results
cv2.imwrite('white_black_text_threshold.png', thresh)
cv2.imwrite('white_black_text_inpainted1.png', result1)
cv2.imwrite('white_black_text_inpainted2.png', result1)

# show results
cv2.imshow('thresh',thresh)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.waitKey(0)
cv2.destroyAllWindows()

阈值和形貌清洗结果:

结果1 (Telea):

结果2 (Navier Stokes):

票数 1
EN

Stack Overflow用户

发布于 2020-09-21 12:57:33

这是我能想到的最好的解决方案,对那些有更多经验的人还是开放的,如果有人有想法的话,可以向我展示一个更好的方法。

代码语言:javascript
运行
复制
mask = cv2.threshold(img, 245, 255, cv2.THRESH_BINARY)[1][:,:,0]
new_mask = cv2.dilate(mask, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10,10)))
dst = cv2.inpaint(img, new_mask, 7, cv2.INPAINT_TELEA)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63986588

复制
相关文章

相似问题

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