1

我有一堆低质量、低对比度(通常也是光线不好)的岩石上的文字照片。我希望我的程序能够检测字母形状(通常非常磨损)。由于我是新手,我尝试应用 sobel / laplacian / canny 滤镜,但照片显然需要一些预处理。您能否建议我可以做些什么来获得更好的结果。我尝试在线搜索,但我发现的解决方案要么不起作用,要么对我来说听起来很神奇。

照片

4

1 回答 1

-1

这个问题需要一个完整的算法。没有使用 OpenCV 在MATLAB/OctavePython/C++中编写完整的代码,这里是我的两分钱,我可能会如何去做。

  1. 该图像中的文本边缘/雕刻在岩石中。我希望首先通过某种直方图均衡来增强图像的对比度。这应该使文本更加突出。(提示:在opencvMATLAB检查calcHist()and 。)equalizeHist()imhist()adapthisteq()

  2. 我会去删除图像中不必要的部分。

    1. 除去所有不是岩石的东西。

      1. 因为这个人会移除所有不是岩石的东西。这意味着,删除靠近顶部的图像部分,这主要是较暗的。您可以对图像进行黑白阈值处理,然后应用霍夫变换来检测图像中最大的水平线或接近水平的线。
      2. 以类似的方式,我会尝试在 45° 处检测岩石边缘。
      3. 使用binary masking删除这两行之上的所有内容。
      4. 这应该会给您留下一个裁剪的图像,类似于此。(提示:参见此处cv2.HoughLines解释的或在 Matlab 上解释的此处。)houghlines

        详细说明这就是我的意思,在此处输入图像描述

    2. 接下来,我将移除岩石右下角周围的那些锋利边缘。在我看来,这可以通过以下两种方式之一来完成。

      • 这些边缘看起来非常精细和锋利。这意味着,高频成分。实际上,这些似乎是整个图像中的最高频率分量。因此,您要么fft()MATLABcv2.idftopencv获取函数,然后将图像转换到频域并删除高于某个频率阈值的所有频率分量。(这个阈值是什么,我不能说。必须测试并查看。注意不要将阈值设置得太低,否则您也会失去文本的清晰度。)。从频域变换回修改后的图像。
      • 或者,更简单地说,您可以使用imgausfiltMATLABopencv模糊图像cv2.filter2D。与这些功能一起使用的过滤器/内核的大小很重要。太大,你会丢失太多细节。
      • 这应该使底部的那些锋利边缘变得平滑。(注意:图像仅用于说明目的。平滑当然会影响整个图像。因此最好将平滑保持在去除那些精细边缘的程度,这样它们就不会在边缘出现 -检测步骤。)在此处输入图像描述
  3. 现在删除了图像的大部分“无趣”部分,您可以在阈值黑白图像上应用一些边缘检测算法(例如 Canny,正如您自己提到的),希望您应该有更多的文本。OpenCV 和 MATLAB 中都存在用于边缘检测的等效函数。

TODO:当然,文本之间的小圆圈仍然是一个问题,算法可以改进(例如匹配圆形等形状,然后)将它们也删除。此外,如何从该图像中重建文本的损坏部分可能更具挑战性(至少对我而言)。

  1. 最后,您可以使用一些 OCR 识别,例如使用tesseractOpenCV,您可以尝试从处理后的图像中提取文本。
于 2019-01-21T10:57:14.277 回答