首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenCV去除纸张上的墨迹

使用OpenCV去除纸张上的墨迹
EN

Stack Overflow用户
提问于 2019-05-20 19:13:30
回答 2查看 929关注 0票数 0

我有一个这样的图像,

如您所见,图像中有一个笔迹。我想去掉那个印记。如何在OpenCV中实现?

我尝试将其转换为HSV,创建一个蓝色范围的蒙版,并使用代码删除它。

代码语言:javascript
复制
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower_blue = np.array([110,50,50]) 
upper_blue = np.array([130,255,255]) 

mask = cv2.inRange(hsv, lower_blue , upper_blue ) 
res = cv2.bitwise_and(img, img, mask= mask) 

它不能像需要的那样工作。所有文本都将被删除。如何解决这个问题?

EN

Stack Overflow用户

回答已采纳

发布于 2019-05-21 00:15:55

你可以取第一个图像数组的阈值。它看起来是这样的:

在这里,可以清楚地看到墨水标记和字母的像素值的差异。阈值之后,它看起来是这样的:

现在可以通过关闭来删除墨迹。然而,它也会减小字母的大小。因此,在逐位OR之后执行侵蚀,以获得没有墨迹标记的掩码。

但是,如果您希望字母看起来像原始图像,您可以将掩码存储在255s的数值数组中,并对原始图像执行逐位“或”运算。

我使用的完整代码是:

代码语言:javascript
复制
img = cv2.imread('ink_mark.png')
wimg = img[:, :, 0]
ret,thresh = cv2.threshold(wimg,100,255,cv2.THRESH_BINARY)

kernel = np.ones((7, 7), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
erosion = cv2.erode(closing, kernel, iterations = 1)
mask = cv2.bitwise_or(erosion, thresh)
white = np.ones(img.shape,np.uint8)*255
white[:, :, 0] = mask
white[:, :, 1] = mask
white[:, :, 2] = mask
result = cv2.bitwise_or(img, white)

cv2.imshow('image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56219829

复制
相关文章

相似问题

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