【发布时间】:2013-07-26 07:09:28
【问题描述】:
想要实现这样的目标:http://www.leptonica.com/binarization.html
在搜索解决方案时,大多数答案都是一般性说明,例如建议查看自适应滤波器、高斯模糊、膨胀和腐蚀,但它们都没有提供任何示例代码开始(因此可以使用这些值) ..
我知道不同的图像需要不同的方法和值来获得最佳清晰度,但我只需要一些通用滤镜,以便在对图像进行任何 OCR 之前,图像与原始图像相比至少稍微锐利一点且噪点更少。
这是我迄今为止尝试过的......
Mat imageMat = new Mat();
Utils.bitmapToMat(photo, imageMat);
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(imageMat, imageMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 4);
但是作为一个图像处理新手,显然我不知道我在做什么XD
原图:
应用上述内容后:
如何正确做?
更新:多亏了 metsburg、berak 和 Aurelius,让我们更接近了
使用 medianBlur 方法,因为带有 CV_MEDIAN 的 cvSmooth 已被弃用并替换为 medianBlur:
Imgproc.medianBlur(imageMat, imageMat, 3);
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);
结果:
使用回GaussianBlur方法,效果其实稍微好一点:
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);
结果:
对于这张图片,差异并不明显,所以我尝试了另一张图片,它是从电脑屏幕上拍摄的照片。电脑屏幕会产生很多噪音(波浪线),因此很难去除噪音。
示例原始图像:
直接应用大津:
在 otsu 之前使用 medianBlur:
在 otsu 之前使用 GaussianBlur:
似乎高斯模糊稍微好一些,但我仍在使用设置.. 如果有人可以就如何进一步改进计算机屏幕照片提出建议,请告诉我们:) 还有一件事.. 在顶部链接内的图像上使用此方法会产生可怕的结果 :( 在这里查看:http://imgur.com/vOZAaE0
【问题讨论】:
-
你是如何得到输出图像的?与本地图像一样,我们转换为 mat 格式,但从 img.proc 中如何查看输出图像?