使用OpenCV(Java)进行阈值图像处理

13

我正在使用OpenCV进行项目开发。我需要将下面的图像转换为阈值图像。

原始图像

我尝试了这个函数:

Imgproc.threshold(imgGray, imgThreshold, 0, 255, Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU); 
但是结果并不理想,如下所示
threshold
因此,我尝试了adaptiveThreshold函数:
Imgproc.adaptiveThreshold(imgGray, imgThreshold, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 11, 2); 

然后产生了以下结果:

adaptiveThreshold

我只希望得到一个二值图像,白色背景和黑色文字,没有黑色区域或噪点(我不想使用 Photo.fastNlMeansDenoising 因为它需要很长时间)。请给我提供一个解决方案。

另外,我正在使用Tesseract识别日语,但准确率不高。您有任何关于更好的OCR日语的建议,或者改进Tesseract质量的方法吗?


我已经很久没有使用openCV了,所以我的话可能有些胡言乱语。你能否搜索轮廓并将轮廓外的所有内容变为白色,将轮廓内的所有内容变为黑色?考虑到输入类型,结果图像应该非常清晰和准确。 - Diego Martinoia
1个回答

25

adaptiveThreshold 在这里是正确的选择。只需要进行一点微调即可。 使用以下参数(虽然是C++,但可以轻松地转换为Java)

Mat1b gray= imread("path_to_image", IMREAD_GRAYSCALE);
Mat1b result;
adaptiveThreshold(gray, result, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 40);

生成的图像如下:

在此输入图像描述


非常感谢。这个对我来说完美无缺。我只是不理解最后一个参数(40)的含义。你能否解释一下? - Bee Bee
@BeeBee 这是从平均值中减去的常数。请阅读opencv文档以获取更多信息。 - Miki
可以在这里展示Java代码,即使是Kotlin也可以。需要从图像中删除阴影。 - M.Yogeshwaran
@Miki,我在AndroidStudio中遇到了无法解析Mat1b的问题,也没有任何建议。我正在使用OpenCV4.2。您能否建议我如何/在哪里解决这个问题? - helloworld
Mat 在 org.opencv.core 中被定义。 - remo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接