有没有办法用 OpenCV 从图像中删除复杂的线条?
Is there a way to remove complex lines from an image with OpenCV?
我有下面列出的这 3 个验证码图像,我想使用 opencv 使文本尽可能干净。有没有pipeline可以实现我想要的?
这是我想要的示例:
这里最大的问题是字母的色差。任何帮助将不胜感激!
以下是我的代码中包含所有图像预处理的部分内容
raw_img = cv2.imread(image_file) #load image
img = cv2.cvtColor(raw_img, cv2.COLOR_RGB2GRAY) #grayscale
_,thresh = cv2.threshold(img,240,255, cv2.THRESH_BINARY_INV + cv2.THRESH_TRUNC) #thresholding
thresh = cv2.bitwise_not(thresh) #invert black and white
#resizing image
resized = cv2.resize(img, (140, 60), interpolation=cv2.INTER_AREA)
img_gray = cv2.copyMakeBorder(resized, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 255, 255])
#blur
blur = cv2.GaussianBlur(img_gray, (3, 3), 0)
# threshold again
_, img = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY or cv2.THRESH_OTSU)
cv2.imshow("Output", img)
cv2.waitKey()
但是,如果我将相同的代码应用于第二个 iamge,例如,这就是我得到的:
我对 OpenCV 比较陌生。我不确定我在这里使用的方法是否正确,如果有人可以帮助我展示其他方法来清理此图像,我将不胜感激!
由于图像中的背景似乎相同,您可以减去背景以找到前景对象。
要获取背景图片,您可以 运行 此代码或使用下面提供的图片。
import numpy as np
import cv2
img = cv2.imread('./test_img3.png') # use the 3rd example
bg = np.repeat(img[:,0, np.newaxis], 180, axis=1) # take the first column and repeat
cv2.imwrite('cap_bg.png', bg)
这给出了下图,然后可以将其用于减法:
要查找行,可以使用 Hough-Transformation。它可以在灰度图像中找到线条,并且在 openCV 文档中有很好的解释。
bin_img = ((img - bg) > 0).astype(np.uint8) * 255 # subtract background and obtain binary image
bin_img = cv2.cvtColor(bin_img, cv2.COLOR_RGB2GRAY) # convert to greyscale image
lines = cv2.HoughLines(bin_img, 1, np.pi/360, 100) # find lines
这会输出在图像中使用霍夫变换和给定参数找到的所有行的列表。
现在你只需要 'erase' 每行,在它们上面画一条背景颜色的线。
您需要尝试使用这些参数,但我希望这对您有所帮助。
我有下面列出的这 3 个验证码图像,我想使用 opencv 使文本尽可能干净。有没有pipeline可以实现我想要的?
这是我想要的示例:
这里最大的问题是字母的色差。任何帮助将不胜感激!
以下是我的代码中包含所有图像预处理的部分内容
raw_img = cv2.imread(image_file) #load image
img = cv2.cvtColor(raw_img, cv2.COLOR_RGB2GRAY) #grayscale
_,thresh = cv2.threshold(img,240,255, cv2.THRESH_BINARY_INV + cv2.THRESH_TRUNC) #thresholding
thresh = cv2.bitwise_not(thresh) #invert black and white
#resizing image
resized = cv2.resize(img, (140, 60), interpolation=cv2.INTER_AREA)
img_gray = cv2.copyMakeBorder(resized, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 255, 255])
#blur
blur = cv2.GaussianBlur(img_gray, (3, 3), 0)
# threshold again
_, img = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY or cv2.THRESH_OTSU)
cv2.imshow("Output", img)
cv2.waitKey()
但是,如果我将相同的代码应用于第二个 iamge,例如,这就是我得到的:
我对 OpenCV 比较陌生。我不确定我在这里使用的方法是否正确,如果有人可以帮助我展示其他方法来清理此图像,我将不胜感激!
由于图像中的背景似乎相同,您可以减去背景以找到前景对象。 要获取背景图片,您可以 运行 此代码或使用下面提供的图片。
import numpy as np
import cv2
img = cv2.imread('./test_img3.png') # use the 3rd example
bg = np.repeat(img[:,0, np.newaxis], 180, axis=1) # take the first column and repeat
cv2.imwrite('cap_bg.png', bg)
这给出了下图,然后可以将其用于减法:
要查找行,可以使用 Hough-Transformation。它可以在灰度图像中找到线条,并且在 openCV 文档中有很好的解释。
bin_img = ((img - bg) > 0).astype(np.uint8) * 255 # subtract background and obtain binary image
bin_img = cv2.cvtColor(bin_img, cv2.COLOR_RGB2GRAY) # convert to greyscale image
lines = cv2.HoughLines(bin_img, 1, np.pi/360, 100) # find lines
这会输出在图像中使用霍夫变换和给定参数找到的所有行的列表。 现在你只需要 'erase' 每行,在它们上面画一条背景颜色的线。 您需要尝试使用这些参数,但我希望这对您有所帮助。