在python

时间:2018-03-16 10:35:23

标签: python opencv image-processing image-thresholding

对于我的项目,我正在尝试使用python中的openCV对图像进行二值化。我使用openCV的自适应高斯阈值来转换图像,结果如下: enter image description here

我想将二进制图像用于OCR,但它太吵了。有没有办法从python中删除二进制图像中的噪音?我已经尝试过openCV中的fastNlMeansDenoising,但它并没有什么区别。

P.S也欢迎更好的二值化选项

3 个答案:

答案 0 :(得分:2)

您应该首先将参数调整为自适应阈值,以便使用更大的区域。这样就不会分割出噪音。每当输出图像的噪声高于输入图像时,您就知道自己做错了。

我建议使用一个自适应阈值来使用一个结构元素(在输入灰度值图像上)和一个足够大的结构元素来删除所有文本。此结果与输入图像之间的差异恰好是所有文本。然后,您可以对此差异应用常规阈值。

答案 1 :(得分:1)

也可以使用GraphCuts进行此类任务。您需要安装maxflow库才能运行代码。我很快从他们的tutorial复制了代码并对其进行了修改,因此您可以更轻松地运行它。只需使用平滑参数来增加或减少图像的去噪。

ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE

Result

答案 2 :(得分:0)

您可以尝试接近形态转换以移除小的"孔"。 首先使用numpy定义内核,您可能需要使用大小。选择与噪音一样大的内核大小。

kernel = np.ones((5,5),np.uint8)

然后使用内核运行morphologyEx。

denoised = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

如果文字被删除,你可以尝试侵蚀图像,这样就可以"成长"黑色像素。如果噪声与数据一样大,这种方法无济于事。

erosion = cv2.erode(img,kernel,iterations = 1)