2016-07-19 132 views
0

我正在使用Python的opencv来清理图像,使之可读取tesseract。我有一个黑白图像,经过自适应阈值处理后,它看起来不够好。有很多纸张噪音,字母不那么干净。我该如何解决它?二进制后创建可读的词

adaptiveThreshold方法:

cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) 

source

adaptiveThreshold后:

after adaptiveThreshold

还我试图腐蚀和膨胀:

kernel = np.ones((2,2), np.uint8) 
e = cv2.erode(roi_sharpen, kernel, iterations=1)) 
d = cv2.dilate(roi_sharpen, kernel, iterations=1)) 

结果:

enter image description here

enter image description here

+0

您可以在二值化之前或之后应用噪声过滤(例如高斯滤波器)。您也可以使用边缘检测滤镜(例如Canny)而不是自适应阈值来提取边缘。 –

+0

我试过了。但更糟的是:/ –

+0

errode和dilate的组合可能会诀窍 –

回答

2

既然你注意到有大量的噪音,它总是一个好主意,尝试一些平滑的图像。

例如,您可以应用高斯滤波器对原始图像

smooth_img = cv.GaussianBlur(img, (5, 5), 0, 0) 
bin_img = cv.adaptiveThreshold(smooth_img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2) 

我试过几个内核的大小,似乎5×5内核给了最好的结果在这个例子中

Binary image with Gaussian blur first

如果您不喜欢图像中的小点,可以进一步应用中值滤镜将其去除

clean_img = cv.medianBlur(bin_img, 3) 

你会得到

After median filter

也有很多参数调整为正方体的也一样,如果你没有得到满意的结果,你可能会想尝试一些不同的正方体设置。

+0

不错!谢谢您的回答。这很有帮助。 –