我想删除包含文字的图像背景,使其在白色背景上显示文字。
到目前为止,我已经尝试过获取图像的HSV和上下边界,但我找不到可以消除所有背景效果的上下边界
到目前为止使用的代码:
TextBox
有没有更好的方法,或者我必须结合多个下边界和上边界来达到我的目标?
答案 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)
这会将左侧图片转换为右侧:
由于你的照片都有纯白色字母,你可以选择一个相当高的恒定阈值(如0为黑色,255为白色),例如230。
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)
答案 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)
<强>输出:强>