我进行了图像预处理以获得用于文本提取的良好图像,但是在应用
adaptiveThreshold
处理后,我发现字符不完整。比如有的像素太大,有的像素太小,有的像素缺失,导致字符不完整、不清晰。
import cv2
import numpy as np
imRGB = cv2.imread('D:\\Senior-project\\images\\024.jpg')
print(imRGB.shape)
imGray = cv2.cvtColor(imRGB, cv2.COLOR_BGR2GRAY)
print(imGray.shape)
blur = cv2.GaussianBlur(imGray, (3,3), 0)
cv2.imwrite('blur.jpg', blur)
contrast = cv2.convertScaleAbs(blur, alpha=1.5, beta=0)
cv2.imwrite('contrast.jpg', contrast)
thresh = cv2.adaptiveThreshold(contrast, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 7)
cv2.imwrite('thresh.jpg', thresh)
kernel = np.array([[0,1,0], [1,1,1], [0,1,0]], np.uint8)
img_erosion = cv2.erode(thresh, kernel, iterations=1)
cv2.imwrite('img_erosion.jpg', img_erosion)
img_dilation = cv2.dilate(img_erosion, kernel, iterations=1)
cv2.imwrite('img_dilation.jpg', img_dilation)
但是,使用Erosion操作似乎会导致字符变得过于放大,导致图像中字符不完整、不清晰。同样,当腐蚀之后再应用膨胀操作来腐蚀并缩小物体的尺寸时,结果只会使字符变得更加不完整。
使用
adaptiveThreshold
后,有什么方法可以将图像中的文字恢复完整清晰吗?我尝试了各种解决方案,包括形态学操作和使用Filter2D
,但我仍然无法解决问题。
我认为通过对图像使用除法归一化您会找到更好的结果。这个概念只是将图像除以图像的模糊版本。使用大模糊。
输入:
import cv2
import numpy as np
# read the image as grayscale
img = cv2.imread('makro.jpg', cv2.IMREAD_GRAYSCALE)
# blur img
blur = cv2.GaussianBlur(img, (0,0), sigmaX=99, sigmaY=99)
# divide img by blur
divide = cv2.divide(img, blur, scale=255)
# save results
cv2.imwrite('makro_divide.jpg',divide)
# show results
cv2.imshow("divide", divide)
cv2.waitKey(0)
结果:
如有必要或需要,您可以在此处增加对比度或阈值。