图像采样方法

最邻近插值(Nearest Neighbour Resampling)

   这种插值方法根据源图像和目标图像之间的相对位置来将目标图像上像素确定为相对源图像上相对位置的像素值,对于任意一幅源图像来说,假设放大后目标图像的宽为Dw高为Dh,任意目标像素点(Dx, Dy)在源图像上的位置为:

其中,(Sx,Sy)为对于的源图像上的像素点,Sw和Sh分别为源图像的宽度和高度。最邻近算法通过找到距离计算得到位置最近的像素作为最终像素值。
   临近点插值算法会产生锯齿效果, 不是一个很好的图像放缩算法,临近点插值算法不改变源像素点到目标像素点的值,只是最简单的位置匹配而已。一个例子如下:

可见效果确实不好,在opencv里一般用该函数计算:

1
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );

src输入图像,dst输出图像,interpolation插值方法:换成CV_INTER_LINEAR和CV_INTER_CUBIC分别表示双线性插值和三次线性插值。下面分别进行介绍。

双线性插值(Bilinear Resampling)

   双线性插值,不是简单copy源像素的值,而是获取四个最邻近目标像素的像素值乘以权重系数。数学公式可表示为:

四个临近点可以根据上面的最邻近插值法得到。计算出来的值是浮点数坐标,分别取整数部分坐标为(j, k), 小数部分坐标为(t, u),如下图所示:

   上式中a,b,c,d分别为a = (1-t)(1-u),b = (1-t)u,c = tu,d = t(1-u),代入上式即可得到目标像素的值。
   双线性内插值算法在图像的放缩处理中,具有抗锯齿功能, 是最简单和常见的图像放缩算法,但是双线性内插值算法没有考虑边缘和图像的梯度变化,相比之下三次线性插值算法更好解决这些问题。

双三次插值(Bicubic Resampling)

   相对于上面分别参考一个像素和四个像素,该算法参考了周围16个像素的像素值,“不仅考虑到四个直接邻点灰度值的影响,还考虑到各邻点间灰度值变化率的影响”,利用了待采样点周围更大邻域内像素的灰度值作三次插值。构造BiCubic函数如下:

   其中,a取-0.5.该函数形状如下:

图像取周围16个像素表示如下所示:

对待插值的像素点(x,y),按如下公式计算:

即可得到目标像素,。

参考:
1.https://blog.csdn.net/jia20003/article/details/6907152
2.http://blog.chinaunix.net/uid-26020768-id-3187769.html
3.https://blog.csdn.net/lanergaming/article/details/49207435
4.https://blog.csdn.net/lichengyu/article/details/8526629

0%