python - OpenCV-如何消除凸轮扫描仪中的凸度缺陷?

标签 python c++ opencv

我发现一种算法可以消除照片的凸度,从而惹上麻烦。如您所见,照片是从书页上捕获的,我想去除凸面。我的问题类似于this,但是我所拥有的只是页面边界作为输入,我既没有网格也无法通过处理算法找到。 enter image description here

我想在下面的照片中将其作为正确的输出。
enter image description here

显然,首先要考虑的是透视变换。但是,您可以看到结果并不乐观:
enter image description here

最佳答案

这是解决您问题的可能途径。主要思想是识别文本,创建带有某种形态的 super Blob ,找到该 super Blob 的4个角,然后将这些点馈送到透 View “unwarper”(或整流器,或您想要称呼的那个)透视校正方法)。

首先将图像转换为灰度,然后将自适应阈值应用于图像。尝试使用参数更适合您的测试的高斯或均值方法。这是我在稍微调整一下值后获得的结果:

enter image description here

现在,想法是仅隔离文本。我应用的解决方案是:获得最大的 Blob 并将其从原始图像中减去。您将需要一种方法来计算每个二进制Blob的面积。 Check this上一篇文章,提供有关如何实现的建议。

这些是图片中最大的 Blob :

enter image description here

从原始图像中减去最大的 Blob 。结果如下:

enter image description here

如您所见,文本几乎是孤立的。让我再次应用区域滤镜来清理像素点。这次消除了小 Blob 。结果如下:

enter image description here

很好,在操作过程中会丢失一些字符,但是没关系。我们需要一个漂亮的连续文本块,因为我们要扩展的 hell 。我尝试应用大小为5和5 Op迭代的矩形结构元素。 侵 eclipse 输出,之后再进行5次迭代,因此最终得到了一个不错的-孤立的- super Blob ,以前的文本是:

enter image description here

一探究竟。您看到的3个标记是我在图像上检测到的最大 Blob 的质心。我们需要找到 super Blob 的 4个角。图像中最大的 Blob 是我们所追求的。我决定重新使用面积过滤器,并寻找面积最大的 Blob 。这是孤立的 super Blob :

enter image description here

从这里开始,操作非常简单。同样,目标是获得该Blob的四个角。您可以拟合矩形或应用边缘检测器,然后进行霍夫变换,以获得跟随 super Blob 边缘的直线。

我决定先应用 Canny Edge检测器,然后再应用 Hough转换。当然,我对转换进行了调整,以仅过滤出我感兴趣的可能的直线,即一定长度以上的直线。这是线路检测的结果:

enter image description here

图片上还有一些额外的信息。您看到的标记(红色和黄色)是线条的起点/终点。我的想法是找到这些线,然后计算这些点的平均值。这个想法是,我们有一个由“象限”分开的点簇。如果我们计算每个象限的每条线的起点和终点的平均值,我们将得到4个平均值–这些是 super Blob 的拐角的近似值!

我将K-means应用于行的起点和终点,但是您非常喜欢其他处理方法。没关系。我的近似角由上图中的大红色O标记标识。

正如我建议的那样,请尝试为这些角指定一个固定的输出位置。我为要映射的角定义了红色矩形。对于此测试,我几乎手动调整了矩形。透视校正产生以下结果:

enter image description here

一些建议:

  • 根据输入图像的分辨率,可以缩小尺寸
    更快,更好的结果,因为您的输入似乎足够
    那。
  • 调整霍夫线检测以产生较大的线。我目前
    配置检测到一些较小的线条,这可能会阻碍
    角点近似。
  • 我选择了一种比较健壮的方法来计算
    我以前使用过的 super Blob (边缘检测+
    Hough Line Transform + K-means),但无论您采用哪种处理链
    选择获取数据完全取决于您!
  • 关于python - OpenCV-如何消除凸轮扫描仪中的凸度缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134783/

    相关文章:

    python - 使用参数数组的长度作为同一函数的另一个参数的默认值

    c++ - 平铺 + OpenGL 纹理翻转

    c++ - QThread::currentThread () 与 QObject::thread()

    android - ndk-build.cmd 编译失败(opencv 人脸检测)

    python - 交换存储在元组中的两个列表的位置

    python - 使用 python 在 matplotlib 中绘制矩阵的一半

    python - Matplotlib 散点图和直方图

    c++ - 如何实现一个在一种情况下具有明显不同实现的类?

    opencv - 相机的外部参数是否以世界坐标系表示?

    c++ - 未在此范围内声明 OpenCV 符号