Python OpenCV-如何消除cam扫描仪中的凸面缺陷?

Python OpenCV-如何消除cam扫描仪中的凸面缺陷?,python,c++,opencv,Python,C++,Opencv,我遇到了麻烦,因为我找到了一种算法来消除照片的凸面。正如你所看到的,这些照片是从书页上截取的,我想去掉凸面。我的问题类似于,但我所拥有的只是作为输入的页面边界,既没有网格,也无法通过处理算法找到 我想输出为正确的一个在下面的照片。 显然,视角转换是首先想到的。但是,正如您所看到的,结果并不乐观: 这里有一个可能的管道来解决您的问题。其主要思想是识别文本,创建一个具有某种形态的超级块,定位该超级块的4个角,并将点输入透视图“unwarper”(或整流器,或任何您希望称之为透视图校正方法的方法)

我遇到了麻烦,因为我找到了一种算法来消除照片的凸面。正如你所看到的,这些照片是从书页上截取的,我想去掉凸面。我的问题类似于,但我所拥有的只是作为输入的页面边界,既没有网格,也无法通过处理算法找到

我想输出为正确的一个在下面的照片。

显然,视角转换是首先想到的。但是,正如您所看到的,结果并不乐观:
这里有一个可能的管道来解决您的问题。其主要思想是识别文本,创建一个具有某种形态的超级块,定位该超级块的4个角,并将点输入透视图“unwarper”(或整流器,或任何您希望称之为透视图校正方法的方法)

首先将图像转换为灰度,然后对其应用自适应阈值。尝试高斯或均值方法,参数更适合您的测试。这是我在摆弄了一点数值后得到的结果:

现在,我们的想法是只隔离文本。我应用的解决方案是:获得最大的斑点,然后从原始图像中减去它们。您需要一种方法来计算每个二进制blob的面积。上一篇关于如何实施一个的建议

以下是图像中最大的斑点:

从原始图像中减去最大的斑点。结果是:

如您所见,文本几乎是孤立的。让我通过再次应用区域过滤器来清理像素的点点滴滴。这一次是为了消除小斑点。结果是:

很好,在操作过程中丢失了一些字符,但没关系。我们需要一个连续的文本块,因为我们要把它放大。我尝试应用大小为5和5的矩形结构元素侵蚀之后再进行5次迭代的输出,因此您最终得到了这个漂亮的、孤立的、超级blob,这是以前的文本:

看看吧。你看到的3个标记是我在图像上检测到的最大斑点的质心。我们需要找到超级水滴的四个角。图像中最大的斑点就是我们所追求的。我决定重新使用面积过滤器,寻找面积最大的水滴。这是孤立的超级水滴:

从这里开始,操作非常简单。同样,我们的目标是得到这个斑点的四个角。可以拟合矩形或应用边缘检测器,然后进行Hough变换,以获得超级水滴边缘之后的直线

我决定应用Canny边缘检测器,然后应用Hough变换。当然,我对转换进行了调整,只过滤我感兴趣的可能的直线——特定长度以上的直线。这是测线检测的结果:

图像上有一些额外的信息。您看到的标记(红色和黄色)是直线的起点/终点。我的想法是找到一组这些线,然后计算这些点的平均值。我们的想法是,我们有一个以“象限”分隔的点群。如果我们计算每象限每条直线的起点和终点的平均值,我们将得到4个平均值——这些是超级水滴角点的近似值

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

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

一些建议:

  • 根据输入图像的分辨率,可以缩小其尺寸 为了更快更好的结果,因为您的输入似乎足够大 那个

  • 调整Hough线检测以产生更大的线。我的电流 配置检测到一些较小的线路,这可能会妨碍 角点近似

  • 我选择了一种比较稳健的方法来计算 我个人使用过的超级水滴(边缘检测)+ Hough线变换+K-均值)但无论您选择什么处理链 选择获取数据完全取决于您


  • 在右下方的图像中,您是否检测到该矩形或只是绘制?不,只是绘制它以引起注意。您是否尝试取消透视图的旋转?在未旋转的空间中,至少需要4个输入点(矩形的角)和4个输出点。如果预先设置最终矩形,则可以固定4个输出点(4个原始输入点的最终位置)。也许如果你,不知何故,检测到了页面的4个角…是的,我尝试的第一件事是透视变换。左图是从原始图像转换而来的透视图。感谢您的完整解释。我试过了,如果我能正确地检测到盒子,效果会很好。但我认为,如果我们让用户选择边界,我们会得到更好的结果。你知道边界对我们有什么帮助吗?