1.投影变换

在仿射变换的过程中,物体的转换都是在二维空间中完成的,但是如果物体在三维空间中发生了转换,这种转换一般叫作投影变换。

因为投影变换是在三维空间内进行的,所以对其进行修正十分困难。但是如果物体是平面的,那么就能通过二维投影变换对此物体三维变换进行模型化,这就是专用的二维投影变换,可由如下公式描述:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(1)

在OpenCV中提供了cv2.getPerspectiveTransform()函数来计算投影变换矩阵,其一般格式为:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(2)

dst表示目标图像。 src表示原始图像。注意 这里需要输入4组对应的坐标变换,src和dst分别是4×2的二维矩阵,其中每一行代表一个坐标,而且数据类型必须是32位浮点型,否则会报错。

python实现:类似于仿射变换,OpenCV提供了cv2.warpPerspective()函数来实现投影变换功能,其一般格式为:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(3)

其中:src表示原始的图像。M表示投影变换矩阵。dsize表示投影后图像的大小。flags表示插值方式。borderMode表示边界模式。borderValue表示边界值。其使用方法与仿射变换相似,只是输入的变换矩阵变为3行3列的投影变换矩阵。

实例:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(4)

执行结果:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(5)

可以看出,变换的效果与一个平面物体在三维空间中进行旋转、平移等变换后的结果相似。因为投影变换矩阵是由4组对应的坐标决定的,所以通过投影变换可以将一幅图“放在”任何不规则的四边形中,而仿射变换却保持了线的平行性。

ps:用人话解释就是,我们如果想要将2维的平面图片在三维空间中进行操作,就必须要先找到你要操作图片的区域坐标,然后再找到你想要将其形变的位置坐标。这样通过公式计算出最终我们需要的M数值,最后将M数值代入到转换函数。最终呈现出来的就是这种效果。

2.极坐标变换

通常利用极坐标变换来校正图像中的圆形物体或被包含在圆环中的物体。

1.笛卡尔坐标转极坐标原理

笛卡儿坐标系xoy平面上的任意一点(x, y),以为中心,通过以下计算公式对应到极坐标系θor上的极坐标(θ, r):

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(6)

上式中,θ的取值范围用角度表示为0~360 °,反正切函数arctan 2返回的角度和笛卡儿坐标点所在的象限有关,如果[插图]在第一象限,反正切的角度范围为0~90°;如果在第二象限,反正切的角度范围为90°~180°;如果在第三象限,反正切的角度范围为-180°~-90°;如果在第四象限,反正切的角度范围为-90°~0°。通常将时返回的正切角度加上一个周期360°,所以经过极坐标变换后的角度范围为0~360°。

2.极坐标转笛卡尔坐标原理

在已知极坐标(θ, r)和笛卡儿坐标的条件下,计算笛卡儿坐标以(x, y)为中心的极坐标变换是(θ, r),可通过以下公式计算:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(7)

3.图像中的应用:

假设输入图像矩阵为I, [插图]代表极坐标空间变换的中心,输出图像矩阵为O,比较直观的策略是利用极坐标和笛卡儿坐标的一一对应关系得到O的每一个像素值,即

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(8)

这里的θ和r都是以1为步长进行离散化的,由于变换步长较大,输出图像矩阵O可能会损失原图的很多信息。可以通过以下方式进行改进,假设要将[插图]与的距离范围为[插图]rmin, rmax[插图]、角度范围在[θmin,θmax ]内的点进行极坐标向笛卡儿坐标的变换,当然这个范围内的点也是无穷多的,仍需要离散化;假设r的变换步长为rstep,0<rstep≤1, θ的变换步长为θstep, θstep一般取[插图], N≥2,则输出图像矩阵的宽[插图],高[插图],图像矩阵O的第i行第j列的值可通过以下公式进行计算:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(9)

4.python中的极坐标变换

在OpenCV中提供了两种进行极坐标变换的函数,分别是linearPolar()函数和logPolar()函数,其中linearPolar()函数的一般格式为:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(10)

其中:src表示原始的图像。 dst表示输出图像。center表示极坐标变换中心。maxRadius表示极坐标变换的最大距离。flags表示插值算法。

logPolar()函数的一般格式为:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(11)

其中: src表示原始的图像。 dst表示输出图像。center表示极坐标变换中心。M表示极坐标变换的系数。flags表示转换的方向。

linearPolar()实例:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(12)

执行结果:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(13)

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(14)

函数linearPolar()生成的极坐标,θ在垂直方向上,r在水平方向上。可以看到里面的图形在垂直方向上被压缩了,这是极坐标变换时θ的步长较大造成的。请注意,linearPolar()函数有两个缺点,第一是变换时的步长不可控,第二是只能对整个圆进行变换。

logPolar()实例:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(15)

执行结果:

pythonopencv图像怎么弄(6.基于python和opencv的图像处理-几何变换2)(16)

显示了logPolar()函数对原始图像的对数极坐标变换,可以看出,M的值越大,变换后得到的图像信息越多。

ps:极坐标的原理确实晦涩难懂,但是在python实现时,我们只要关注这两个函数就行,知道极坐标的两个函数中,每一个参数代表什么意思,如何修改即可。

(以上内容为机器学习:基于OpenCV和Python的智能图像处理个人学习笔记,此书由高敬鹏、江志烨、赵娜编写,如有侵权,联系删除)

,