前言
有的时候,我们想要计算指标,我们在裁剪出来以后发现图像是Geotiff,是具有地理坐标的。而利用shp裁剪或者用行列等裁剪方法裁剪出来的结果是一个长方形(往往是带有无效的值的)。如下图中左图所示,我们想将其转换为右图形式,以便于防止和其他图像一起计算某些结果的时候(混淆矩阵,比如另外一幅图像没有白边)。这个时候就需要使用仿射变换来解决这个问题。
一、仿射变换
1.什么是仿射变换
图像各种变换的概念参考链接
整理资料为:
(1)图像的几何变换主要分为三类:刚性变换、仿射变换和透视变换
笔者加入:可以看到刚性变换其实真的是“刚的”,只能旋转平移等;而仿射变换,有一种弹性的感觉,就是这个长方形的四个顶点是活动的,可以转;而透视变换就有了三维空间的感觉。
(2)图像基本变换包括:平移(Translation)、缩放(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)
(3)其中错切的概念指的是:
(4)仿射变换是由:平移+旋转+缩放+错切组成的。
(5)仿射变换原理:矩阵的运算。具体见上面链接。
因此要想将上述前言中的图像摆正,就必须经过仿射变换
二、python-opencv实现仿射变换
1.使用python-opencv实现反射变换
上面这个链接写的非常好,上面的链接给出了对图像实现平移,旋转,缩放,翻转的代码。直接参考就可以了,而且博主还封装好了函数,非常好用,点赞!!!
直接使用就可以了。
三、仿射变换后对无效值/零值的处理
1.有的时候虽然你对图像已经用过了仿射变换,但是白边值还有可能有分布的。比如说前言中的那两幅图。左边是原图,右边是我经过方法和旋转后的图像,但是两侧仍然有白边存在。(然而我已经不能再放大了,在方法有些值就要丢失了。)
2.这个时候就要考虑如何消除数组中不要的值了。
参考链接为:NumPy数组ndarray中提取,删除满足条件的元素,行和列、Numpy数组(ndarray)中含有缺失值(nan)行和列的删除方法
总结:上面的链接中从以下几个角度对如何删除或替换数组中的元素或者行列做了说明:(这里只总结结论,具体例子和用法得看链接)
(1)提取满足条件的元素,请使用ndarray [条件表达式],将返回返回一个展平的一维数组
(2)numpy.all():提取所有元素均满足条件的行/列,返回的是行或列满不满足条件,满足条件就True,不满足就False
numpy.any():提取具有至少一个满足条件的元素的行/列
(3)将负运算符〜添加到条件中,则将提取不满足条件的元素,行和列。这等效于删除满足条件的元素/行/列
(4)使用np.delete()将目标ndarray,删除指定索引的行或者列
(5)组合使用np.delete()和np.where()可以删除满足条件的行和列或者元素
(6)对于多种条件,可以使用&或|连接。
我使用的删除前言中作图的百变的方法是使用使用负数运算符。
第一行代码中axis= 1代表判断哪一行满足/不满足条件。我使用了np.all(),意思就是必须是哪一行全部满足或者不满足某种条件时才执行删除操作。因为我又使用了负操作符,所以第一句话的意思就是判断哪一行全部都等于0((a==0).all(axis=1)的作用),把不满足全行等于0的行留下(a【-某条件】的作用,