想要实现这样的东西: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方法,因为cvSmooth和CV_MEDIAN已被弃用,并替换为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:

在otsu之前使用medianBlur:

在otsu之前使用GaussianBlur:

看起来高斯模糊稍微好一点,但是我仍然在玩设置。如果有人能建议如何进一步改进电脑屏幕照片,请让我们知道:)还有一件事。在顶部链接内的图像上使用此方法会产生可怕的结果:(请参阅此处:http://imgur.com/vOZAaE0
发布于 2013-10-08 20:18:09
不要使用Imgproc.THRESH_BINARY_INV,只使用Imgproc.THRESH_BINARY,因为_INV会在二值化之后对图像进行反转,结果就是上面示例中所示的输出。
正确的代码:
Imgproc.adaptiveThreshold(imageMat, imageMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 4);https://stackoverflow.com/questions/17874149
复制相似问题