C#双三次插值缩放图像
图像缩放操作中,输出图像像素点坐标有可能对应于输入图像上几个像素点之间的位
置,需要通过灰度插值处理来计算出该输出点的灰度值。不同的插值算法有不同的精度,
直接影响着图像的失真程度。最常用的插值算法有三种:最近邻插值、双线性插值、双三
次插值,其中双三次插值的效果是最佳的。
由于图像像素的灰度值是离散的, 因此一般的处理方法是对原来在整数点坐标上的像素
值进行插值生成连续的曲面, 然后在插值曲面上重新采样以获得缩放图像像素的灰度值。缩
放处理从输出图像出发,采用逆向映射方法,即在输出图像中找到与之对应的输入图像中
的某个或某几个像素,采用这种方法能够保证输出图像中的每个像素都有一个确定值,否
则,如果从输入图像出发来推算输出图像,输出图像的像素点可能出现无灰度值的情况。
因为,对图像进行缩放处理时输出图像像素和输入图像之间可能不再存在着一一对应关系。
双三次插值不仅考虑到周围四个直接相邻像素点灰度值的影响,还考虑到它们灰度值
变化率的影响。在这种方法中,函数 f 在点 (x, y) 的值可以通过矩形网格中最近的十六个采
样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。通
过双三次插值可以得到一个连续的插值函数,它的一阶偏导数连续,并且交叉导数处处连
续。
双三次插值核如下:
这里参考 AForge.NET 实现了双三次插值算法,并将实验结果与 GDI+及 EmguCV 自带
的双三次插值算法效率进行比较(缩放同一幅图像到相同尺寸,计算平均耗时,同时参考
缩放效果)。
(1)双三次插值算法实现代码:
双三次插值缩放灰度图像。
源图像。
新宽度。
新高度。
缩放后的图像。
!!"
#
检查源图像格式
$%&'(' ")
锁定源图像内存
**+,'%
-!-!+!+"!
,'%.'+/!+01('")
新建目标图像
$ !")
锁定目标图像内存
**+,'%
-!-!!"!
,'%.'+!01('+('21")
#
*!3*")
4
5
#
解锁图像内存
+6'% *")
+6'% *")
4
评论4