我有一堆低质量、低对比度(通常也是光线不好)的岩石上的文字照片。我希望我的程序能够检测字母形状(通常非常磨损)。由于我是新手,我尝试应用 sobel / laplacian / canny 滤镜,但照片显然需要一些预处理。您能否建议我可以做些什么来获得更好的结果。我尝试在线搜索,但我发现的解决方案要么不起作用,要么对我来说听起来很神奇。
问问题
1939 次
1 回答
-1
这个问题需要一个完整的算法。没有使用 OpenCV 在MATLAB/Octave或Python/C++中编写完整的代码,这里是我的两分钱,我可能会如何去做。
该图像中的文本边缘/雕刻在岩石中。我希望首先通过某种直方图均衡来增强图像的对比度。这应该使文本更加突出。(提示:在opencv或MATLAB中检查
calcHist()
and 。)equalizeHist()
imhist()
adapthisteq()
我会去删除图像中不必要的部分。
除去所有不是岩石的东西。
- 因为这个人会移除所有不是岩石的东西。这意味着,删除靠近顶部的图像部分,这主要是较暗的。您可以对图像进行黑白阈值处理,然后应用霍夫变换来检测图像中最大的水平线或接近水平的线。
- 以类似的方式,我会尝试在 45° 处检测岩石边缘。
- 使用binary masking删除这两行之上的所有内容。
这应该会给您留下一个裁剪的图像,类似于此。(提示:参见此处
cv2.HoughLines
解释的或在 Matlab 上解释的此处。)houghlines
接下来,我将移除岩石右下角周围的那些锋利边缘。在我看来,这可以通过以下两种方式之一来完成。
- 这些边缘看起来非常精细和锋利。这意味着,高频成分。实际上,这些似乎是整个图像中的最高频率分量。因此,您要么
fft()
从MATLAB或cv2.idft
从opencv获取函数,然后将图像转换到频域并删除高于某个频率阈值的所有频率分量。(这个阈值是什么,我不能说。必须测试并查看。注意不要将阈值设置得太低,否则您也会失去文本的清晰度。)。从频域变换回修改后的图像。 - 或者,更简单地说,您可以使用
imgausfilt
MATLAB或opencv模糊图像cv2.filter2D
。与这些功能一起使用的过滤器/内核的大小很重要。太大,你会丢失太多细节。 - 这应该使底部的那些锋利边缘变得平滑。(注意:图像仅用于说明目的。平滑当然会影响整个图像。因此最好将平滑保持在去除那些精细边缘的程度,这样它们就不会在边缘出现 -检测步骤。)
- 这些边缘看起来非常精细和锋利。这意味着,高频成分。实际上,这些似乎是整个图像中的最高频率分量。因此,您要么
现在删除了图像的大部分“无趣”部分,您可以在阈值黑白图像上应用一些边缘检测算法(例如 Canny,正如您自己提到的),希望您应该有更多的文本。OpenCV 和 MATLAB 中都存在用于边缘检测的等效函数。
TODO:当然,文本之间的小圆圈仍然是一个问题,算法可以改进(例如匹配圆形等形状,然后)将它们也删除。此外,如何从该图像中重建文本的损坏部分可能更具挑战性(至少对我而言)。
- 最后,您可以使用一些 OCR 识别,例如使用tesseract和OpenCV,您可以尝试从处理后的图像中提取文本。
于 2019-01-21T10:57:14.277 回答