Java OpenCV阈值与预期不同

Java OpenCV阈值与预期不同,java,opencv,Java,Opencv,我想对给定的图片进行阈值化预处理,然后将其交给Tesseract。我首先使用Gimp(2.8.16)和130–255的固定范围来实现这一点。然后,当我使用Java在OpenCV(3.1)中实现它时,我首先忘记了调用cvtColor,导致图片中仍然有一些颜色(这些区域在Gimp中是白色的)。除此之外,这张照片和预期的一样。然而,当我实现相应的调用时,我得到了一个与我预期的不同的图片。看起来以前着色的区域现在是黑色的,而剩下的图片类似于我用Gimp创建的图片 在创建更相似的输出时,我是否缺少什么 我

我想对给定的图片进行阈值化预处理,然后将其交给Tesseract。我首先使用Gimp(2.8.16)和130–255的固定范围来实现这一点。然后,当我使用Java在OpenCV(3.1)中实现它时,我首先忘记了调用cvtColor,导致图片中仍然有一些颜色(这些区域在Gimp中是白色的)。除此之外,这张照片和预期的一样。然而,当我实现相应的调用时,我得到了一个与我预期的不同的图片。看起来以前着色的区域现在是黑色的,而剩下的图片类似于我用Gimp创建的图片

在创建更相似的输出时,我是否缺少什么

我问这个问题的原因是,不幸的是,Tesseract(使用psm 6)为两个图像创建了完全不同的结果:

  • 对于Gimp中创建的“2011 1 L 0006”
  • 对于使用OpenCV创建的第二个:“2011ÔÔïL 0 0006 1”
以下是我使用的代码:

Mat thres = new Mat();
Mat tmp = new Mat();
Imgproc.cvtColor(src, tmp, Imgproc.COLOR_BGR2GRAY); // tmp = src.clone(); in my first attempt
Imgproc.threshold(tmp, thres, 130, 255, Imgproc.THRESH_BINARY);
Imgcodecs.imwrite("output.jpg", thres);
以下是照片:

给定图片:

使用Gimp创建的图片:

使用OpenCV的第一个结果:

使用OpenCV的第二个结果:


在第一种情况下,您正在对彩色图像进行阈值处理(tmp=src.clone()创建另一个src副本,它是彩色图像)。所以你会得到这样的结果,在第二种情况下,你会首先转换成灰度,然后阈值化,这会得到更好的结果。阈值处理在灰度图像上很好。

非常感谢您的回答!我想创建它的基础上的彩色图像。但是,我不希望结果图像中有彩色部分,而只希望有黑色部分(比如看起来大部分是黑色的字体)。我还需要做些什么才能做到这一点?你可以迭代图像,检查三个通道中的像素值,如果在所有三个通道中都是0或255,则保持相同的值,否则替换为0,这将使这些颜色值变为黑色。