对于我的项目,我正在尝试使用python中的openCV对图像进行二值化。我使用openCV的自适应高斯阈值来转换图像,结果如下:
我想将二进制图像用于OCR,但它太吵了。有没有办法从python中删除二进制图像中的噪音?我已经尝试过openCV中的fastNlMeansDenoising,但它并没有什么区别。
P.S也欢迎更好的二值化选项
答案 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
答案 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)