简介
接下来的时间我将继续学习几何图像变换部分,几何图像变换是指一系列用于图像处理和计算机视觉中的操作,用于改变图像的空间特性。这些变换包括缩放、旋转、平移、错切以及透视变换等。它们常用于诸如图像对齐、校正、视角转换等任务。
几何图像变换的基本概念和工作原理
本节中的函数执行各种二维图像的几何变换。它们不改变图像的内容,而是变形像素网格并将此变形网格映射到目标图像。事实上,为了避免采样伪影,映射是按相反顺序进行的,即从目标图像到源图像。也就是说,对于目标图像中的每个像素 (x, y),函数计算出相应"捐赠"像素在源图像中的坐标,并复制该像素值:
dst ( x , y ) = src ( f x ( x , y ) , f y ( x , y ) ) \texttt{dst} (x,y)= \texttt{src} (f_x(x,y), f_y(x,y)) dst(x,y)=src(fx(x,y),fy(x,y))
在您指定前向映射 < g x , g y > : src → dst \left<g_x, g_y\right>: \texttt{src} \rightarrow \texttt{dst} ⟨gx,gy⟩:src→dst的情况下,OpenCV 函数首先计算对应的逆向映射 < f x , f y > : dst → src \left<f_x, f_y\right>: \texttt{dst} \rightarrow \texttt{src} ⟨fx,fy⟩:dst→src, 然后使用上述公式
实际实现从最通用的 remap 到最简单最快的 resize 的几何变换,需要解决上述公式的两个主要问题:
- 不存在像素的外推 :与上一节中描述的过滤函数类似,对于某些 ( x , y ) (x,y) (x,y), f x ( x , y ) f_x(x,y) fx(x,y)或 f y ( x , y ) f_y(x,y) fy(x,y)或两者都可能落在图像之外。在这种情况下,需要使用一种外推方法。OpenCV 提供了与过滤函数中相同的外推方法选择。此外,它还提供了 BORDER_TRANSPARENT 方法。这意味着目标图像中对应的像素根本不会被修改。
- 像素值插值 :通常, f x ( x , y ) f_x(x,y) fx(x,y)或 f y ( x , y ) f_y(x,y) fy(x,y)是浮点数。这意味着 < f x , f y > \left<f_x, f_y\right> ⟨fx,fy⟩可以是仿射变换、透视变换或径向镜头失真校正等。因此,需要从分数坐标中检索像素值。最简单的情况下,坐标可以四舍五入到最近的整数坐标,并使用相应的像素。这被称为最近邻插值。然而,通过使用更复杂的插值方法可以获得更好的结果,其中在计算像素 ( f x ( x , y ) , f y ( x , y ) ) (f_x(x,y), f_y(x,y)) (fx(x,y),fy(x,y)),的某个邻域内拟合多项式函数,然后取该多项式在 ( f x ( x , y ) , f y ( x , y ) ) (f_x(x,y), f_y(x,y)) (fx(x,y),fy(x,y)) 处的值作为插值像素值。在 OpenCV 中,您可以选择几种插值方法。有关详情,请参阅 resize 函数。
注: 几何变换不适用于 CV_8S 或 CV_32S 类型的图像。