OpenCV - 如何消除凸轮扫描仪中的凸面缺陷?
Posted
技术标签:
【中文标题】OpenCV - 如何消除凸轮扫描仪中的凸面缺陷?【英文标题】:OpenCV - How to remove convexity defects in a cam scanner? 【发布时间】:2020-02-09 08:28:34 【问题描述】:我找到了一种算法来消除照片的凸度,因此遇到了麻烦。如您所见,照片是从书页上拍摄的,我想去除凸面。我的问题类似于this,但我所拥有的只是页面边界作为输入,我既没有网格也无法通过处理算法找到。
我想在下面的照片中输出正确的那个。
显然,首先想到的是透视变换。但是,如您所见,结果并不乐观:
【问题讨论】:
在右下图中,您是检测到那个矩形还是只是绘制? 不,只是为了引起注意。 您是否尝试过展开视角?在未扭曲的空间中,您至少需要 4 个输入点(矩形的角)和 4 个输出点。如果您预先设置最终矩形,则可以固定 4 个输出点(您的 4 个原始输入点的最终位置)。也许如果你以某种方式检测到页面的 4 个角...... 是的,我尝试的第一件事是透视变换。左图是从原始图像转换而来的透视图。 申请4 point perspective transform 【参考方案1】:这是解决您的问题的可能管道。主要思想是识别文本,用某种形态创建一个 super blob,定位这个 super blob 的 4 个角,并将这些点提供给一个透视“unwarper”(或 rectifier,或其他您希望调用该透视校正方法)。
首先将您的图像转换为灰度图像,然后对其应用自适应阈值。尝试使用更适合您的测试的参数的高斯或均值方法。这是我在摆弄了一下值后得到的结果:
现在,我们的想法是只隔离文本。我应用的解决方案是:获取最大的斑点并从原始图像中减去它们。您将需要一种方法来计算每个二进制 blob 的面积。 Check thisprevious post 获取有关如何实施的建议。
这些是图像中最大的斑点:
从原始图像中减去最大的斑点。结果如下:
如您所见,文本几乎是孤立的。让我再次应用一个区域过滤器来清理一点点像素。这次要消除小斑点。结果如下:
很好,操作过程中有些字符丢失了,不过没关系。我们需要一个漂亮的连续文本块,因为我们要扩大它的地狱。我尝试应用大小为 5 和 5 Op 迭代的矩形结构元素。 侵蚀输出之后再进行 5 次迭代,所以你最终会得到这个漂亮的 - 隔离的 - 超级 blob,之前的文本是:
检查一下。您看到的 3 个标记是我在图像上检测到的最大斑点的质心。我们需要找到 super blob 的 4 个角。图像中最大的斑点是我们所追求的。我决定重新使用面积过滤器并寻找面积最大的斑点。这是孤立的超级 blob:
从这里开始,操作非常简单。同样,目标是获得这个 blob 的四个角。您可以拟合一个矩形或应用边缘检测器,然后进行霍夫变换,以获得沿着超级斑点边缘的直线。
我决定应用 Canny Edge 检测器,然后应用 霍夫变换。当然,我调整了变换以仅过滤我感兴趣的可能线——超过一定长度的直线。这是线路检测的结果:
图像上绘制了一些额外的信息。您看到的标记(红色和黄色)是线条的起点/终点。我的想法是找到一堆这样的线并计算这些点的mean。这个想法是我们有一组点,这些点在“象限”中分开。如果我们计算每条线每个象限的起点和终点的平均值,我们将得到 4 个平均值——这些是超级斑点角的近似值!
我将K-means 应用于线条的起点和终点,但您更喜欢其他处理方法。没关系。我的近似角由上图中的大红色 O 标记标识。
按照我的建议,尝试为这些角提供一个固定的输出位置。我为要映射的角定义了红色矩形。对于这个测试,我几乎手动调整了矩形。透视校正产生以下结果:
一些建议:
根据输入图像的分辨率,您可以缩小它 为了更快更好的结果,因为您的输入似乎足够大 那个。
调整霍夫线检测以产生更大的线。我现在的 配置检测到一些较小的线路,这可能会阻碍 角近似。
我选择了一种比较稳健的方法来计算 我之前亲自使用过的超级blob(边缘检测+ Hough Line Transform + K-means),但无论您使用哪种处理链 选择获取数据完全取决于您!
【讨论】:
感谢您的完整解释。我以某种方式尝试过,如果我正确检测到盒子,它会很好用。但是我认为如果我们让用户选择边界来使用你所说的算法,我们会得到更好的结果。你知道界限如何帮助我们吗?以上是关于OpenCV - 如何消除凸轮扫描仪中的凸面缺陷?的主要内容,如果未能解决你的问题,请参考以下文章