想要实现这样的目标: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);
Run Code Online (Sandbox Code Playgroud)
但作为一个图像处理新手,显然我不知道我在做什么XD
原图:

申请上述后:

怎么做正确?
更新:感谢metsburg,berak和Aurelius让它更加接近
使用medianBlur方法,因为cvSmooth与CV_MEDIAN不推荐使用并替换为medianBlur:
Imgproc.medianBlur(imageMat, imageMat, 3);
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
结果:

使用GaussianBlur方法,结果实际上稍好一些:
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
结果:

对于这个图像,差异并不明显,所以我尝试了另一个图像,这是从计算机屏幕上拍摄的照片.电脑屏幕会产生很多噪音(波浪线),因此很难消除噪音.
示例原始图像:

直接申请otsu:

在otsu之前使用medianBlur:

在otsu之前使用GaussianBlur:

似乎高斯模糊稍微好一点,但是我还在玩设置..如果有人可以建议如何进一步改进电脑屏幕照片,请告诉我们:)还有一件事......使用这种方法就可以了顶部链接中的图像会产生可怕的结果:(在此处查看:http://imgur.com/vOZAaE0
met*_*urg 10
好吧,你快到了.试试这些修改:
代替
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Run Code Online (Sandbox Code Playgroud)
尝试:
cvSmooth(imageMat, imageMat, CV_MEDIAN, new Size(3, 3), 0);
Run Code Online (Sandbox Code Playgroud)
检查语法,可能不完全匹配
您发布的链接使用了Otsu的阈值,请尝试这样:
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
用于阈值处理.
尝试在这里和那里调整参数,你应该得到一些非常接近你期望的结果.
| 归档时间: |
|
| 查看次数: |
16882 次 |
| 最近记录: |