使用OpenCV和Python(正确)旋转图像(P1)
在这篇文章的剩余部分,我将讨论使用OpenCV和Python旋转图像时可能遇到的常见问题。
具体来说,我们将研究在旋转过程中,当图像的角点被“切断”时会发生什么。
为了确保我们都理解OpenCV和Python的轮换问题,我将:
从一个简单的例子开始演示旋转问题。
提供旋转功能,确保图像在旋转过程中不会被切断。
讨论我是如何使用此方法解决药片识别问题的。
OpenCV的一个简单旋转问题
让我们以一个示例脚本开始这篇博客文章。
打开一个新文件,将其命名为rotate_simple.py,并输入以下代码:
第3-6行首先导入我们所需的Python包。
如果您还没有安装imutils,即我的OpenCV便利功能系列,那么现在就可以在终端中输入以下代码:
如果已经安装了imutils,请确保已升级到最新版本:
从这里开始,第8-10行解析我们的命令行参数。我们在这里只需要一个开关,——image,这是我们的映像驻留在磁盘上的路径。
让我们继续实际旋转我们的图像:
第15行加载我们要从磁盘旋转的图像。
然后,我们以15度的增量(第18行)在[0,360]范围内的各种角度上循环。
对于每一个角度,我们称之为imutils。旋转,将图像围绕图像中心旋转指定数量的角度。然后我们将旋转后的图像显示到屏幕上。
第24-27行执行相同的过程,但这次我们称之为imutils.rotate_bound(我将在下一节提供此函数的实现)。
正如该方法的名称所示,我们将确保整个图像都绑定在窗口内,并且没有任何图像被切断。
要查看此脚本的运行情况,请确保使用本文的结尾部分找到源代码,然后执行以下命令:
使用imutils的输出。非方形图像上的旋转功能如下所示:
(图还没做好,过一段时间会补上)
正如你所看到的,图像在旋转时被“切断”——无法将整个图像放在视野中。
但如果我们使用imutils。我们可以解决这个问题:
(同上图)
太棒了,我们解决了问题!
那么这是否意味着我们应该始终使用.rotate_bound到.rotate法?
是什么让它如此特别?
究竟发生了什么?
我将在下一节回答这些问题。