首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用OpenCV对图像进行处理,使文本变得清晰?

如何使用OpenCV对图像进行处理,使文本变得清晰?
EN

Stack Overflow用户
提问于 2013-07-26 14:11:09
回答 1查看 19.9K关注 0票数 21

想要实现这样的东西:http://www.leptonica.com/binarization.html

在搜索解决方案时,大多数答案都是通用指令,例如建议查看自适应滤波器、高斯模糊、膨胀和侵蚀,但它们都没有提供任何示例代码(因此可以玩弄这些值)。

我知道不同的图像需要不同的方法和值来达到最佳的清晰度,但我只需要一些通用的滤波器,以便在对图像进行任何OCR之前,图像至少比原始图像更清晰,噪音更少。

这就是我到目前为止所尝试的..

代码语言:javascript
复制
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:

代码语言:javascript
复制
Imgproc.medianBlur(imageMat, imageMat, 3);
Imgproc.threshold(imageMat, imageMat, 0, 255, Imgproc.THRESH_OTSU);

结果:

使用返回的GaussianBlur方法,结果实际上稍好一些:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2013-10-08 20:18:09

不要使用Imgproc.THRESH_BINARY_INV,只使用Imgproc.THRESH_BINARY,因为_INV会在二值化之后对图像进行反转,结果就是上面示例中所示的输出。

正确的代码:

代码语言:javascript
复制
Imgproc.adaptiveThreshold(imageMat, imageMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 4);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17874149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档