用于边缘检测的图像预处理-低质量,低对比度

时间:2019-01-20 19:25:53

标签: image-processing edge-detection image-preprocessing

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

Photo

1 个答案:

答案 0 :(得分:-1)

此问题需要完整的算法。缺少使用OpenCV 在 MATLAB / Octave Python / C ++中编写完整代码的方法,这是我的两分钱,我可能会如何解决。

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

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

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

      1. 为此,将移除所有不是岩石的东西。这意味着删除顶部附近的图像部分,该部分通常较暗。您可以在图像上进行黑白阈值,然后应用霍夫变换来检测图像中最大的水平线或接近水平的线。
      2. 我将以类似的方式尝试检测45°处的岩石边缘。
      3. 使用binary masking删除这两行上方的所有内容。
      4. 这应该使您得到裁剪后的图像,接近此图像。 (提示:请参见here中所述的cv2.HoughLineshere中所述的houghlines在Matlab上。)

        要详细说明我的意思,enter image description here

    2. 接下来,我将去除岩石右下角周围的那些尖锐边缘。我认为这可以通过以下两种方式之一来完成。

      • 这些边缘看起来非常且清晰。也就是说,高频组件。实际上,这些似乎是整个图像中的最高频率分量。因此,您可以采用MATLAB中的fft()函数,也可以采用opencv中的cv2.idft并将图像变换到频域,并删除高于某个频率阈值的所有频率分量。 (该阈值是什么,我不能说。必须测试一下才能看到。请注意不要将阈值设置得太低,否则也可能失去文本的清晰度。)。从频域变回已修改的图像。
      • 或者,更简单地说,您可以使用MATLAB中的imgausfiltopencv中的cv2.filter2D来模糊图像。与这些功能一起使用的过滤器/内核的大小很重要。太大,会丢失太多细节。
      • 这应该使底部的锐利边缘平滑。 (请注意:该图像仅用于说明目的。平滑处理当然会影响整个图像。因此,最好将平滑处理的影响降低到与去除那些细微边缘相同的程度,这样在边缘出现时它们不会出现-检测步骤。)enter image description here
  3. 现在,删除了图像“无趣”部分的大部分内容后,您可以在阈值黑白图像上应用一些边缘检测算法(例如,Canny,正如您所提到的那样),希望您应该有更多的文本。 OpenCV和MATLAB中都存在等效的边缘检测功能。

待办事项:当然,文本之间的小圆圈仍然是一个问题,可以对算法进行优化(例如,匹配圆形等形状),然后将其删除。另外,如何从该图像中重建文本的受损部分可能更具挑战性(至少对我而言)。

  1. 最后,您可以使用某些OCR识别功能,例如,使用 tesseract OpenCV,可以尝试从处理后的图像中提取文本。