OpenCV:文本处理和噪声消除

时间:2018-06-08 20:56:06

标签: python opencv opencv3.0

我想删除包含文字的图像背景,使其在白色背景上显示文字。

图片样本
enter image description here

到目前为止,我已经尝试过获取图像的HSV和上下边界,但我找不到可以消除所有背景效果的上下边界

到目前为止使用的代码:

TextBox

有没有更好的方法,或者我必须结合多个下边界和上边界来达到我的目标?

2 个答案:

答案 0 :(得分:6)

您可以将图像读取为灰度并设置阈值:

import cv2

img = cv2.imread('img2.png', 0)     # 0 means grayscale
new_img = (img >= 230)*255          # 230 is the threshold, change as desired
cv2.imwrite('mask.png',new_img)

这会将左侧图片转换为右侧:

Original Output

由于你的照片都有纯白色字母,你可以选择一个相当高的恒定阈值(如0为黑色,255为白色),例如230。

修改

@Ishara Madhawa对使用内核摆脱中心条纹有一个非常好的想法。但是,如果您使用cv2.morphologyEx,则不会更改字母的粗细:

import cv2

img = cv2.imread('img2.png', 0)
new_img = ((img >= 230)*255).astype('uint8')
cv2.imwrite('mask.png',255-new_img)    # 255-... to get black on white

kernel = np.ones((5, 1), np.uint8)    
new_img2 = cv2.morphologyEx(new_img, cv2.MORPH_CLOSE, kernel)
cv2.imwrite('mask2.png',255-new_img2)

without kernel with kernel

答案 1 :(得分:3)

此解决方案将解决您的问题。

这是解决方案的完整代码:

import cv2
import numpy as np
image = cv2.imread('input.png',0)

retval, thresh_gray = cv2.threshold(image, thresh=200, maxval=255,type=cv2.THRESH_BINARY_INV)

cv2.bitwise_not(thresh_gray,thresh_gray)

kernel = np.ones((5, 1), np.uint8)
joined = cv2.dilate(thresh_gray, kernel, iterations=1)
cv2.imshow('joined', joined)
cv2.waitKey(0)

首先,您应该将图像读取为灰度。

image = cv2.imread('input.png',0)

<强>输出:

之后,您应该设置一个阈值,以消除背景噪音。在这种情况下,我设置了手动阈值(200)以获得最优化的结果。

retval, thresh_gray = cv2.threshold(image, thresh=200, maxval=255,type=cv2.THRESH_BINARY_INV)

<强>输出:

然后,在执行bitwise_not(交换黑色和白色)之后,您应该使用5 x 1内核来连接中间的分隔字符。角色中间的两条水平线将消失。

cv2.bitwise_not(thresh_gray,thresh_gray)
kernel = np.ones((5, 1), np.uint8)
joined = cv2.dilate(thresh_gray, kernel, iterations=1)

<强>输出: