Halcon 学习笔记(灰度值插值算法)
#Halcon 学习笔记(灰度值插值算法)
本文内容翻译自 Halcon 应用笔记 :Gray Value Interpolation,根据我自己的理解,对原文内容进行了删减。
这篇笔记介绍 Halcon 算子中用到像素插值算法。对于使用 Halcon 其实是不需要了解插值算法的细节的。但是了解细节可以让我们更好的应用那些算子。
我们知道在对图像进行旋转、缩放或者畸变校正时就会涉及到像素插值。比如下图中这个例子。左边是原始图像,我们对原始图像进行旋转和缩小。
可以看到旋转和缩小后的图像与原始图像的像素点是不重合的,所以为了获得输出的图像我们就要求出这些新的位置的像素点的值。这就是今天要讲的像素插值。我们下面
Halcon 软件中实现了如下的几种插值方法:
- 最邻近插值 nearest_neighbor
- 双线性插值 bilinear
- 双线性平均插值 constant
- 双线性加权插值 weighted
- 双二次插值 bicubic 和 bicubic_clipped
下面我们就来依次介绍这些方法。
最邻近插值 nearest_neighbor
所谓最邻近插值顾名思义就是找与待计算的像素点最近邻的原始图像中的像素点,然后用这个像素点的值来代替我们要计算的像素点的值。下面有个示例:
我们要计算的像素点时那个黑色的像素点,白色的像素点时原始图像中的像素点。那么计算可知 p10 这个像素离我们要计算的像素点最近,我们就用 P10 像素点的值来代替我们要计算的像素点的值。这种算法计算速度很快,但是图像中容易出现锯齿状的假象。
##双线性插值 bilinear
所谓双线性插值就是用最邻近的四个像素点用线性插值的方法获得我要计算的像素点的值。
双线性插值的计算公式如下:
简单的说,双线性插值得到的结果比最邻近插值要好。但是计算速度要慢很多。如果降采样,可能图像会出现假象。
双线性平均插值 constant
这个方法还是双线性插值。但是插值时做了个升采样。以下图为例,我们要计算的像素点是两个虚线的交叉的处的那个像素点。这个像素所在的区域为斜的方框。‘constant’ 方法是将这个像素在细分为四个小像素。对应图中的四个黑色的点,然后用双线性插值去计算这四个小像素的像素值。算出来之后对这四个像素点取平均。
双线性加权插值 weighted
这个方法和上面介绍的 constant 方法类似,区别是我们将一个像素分成了 9 个子像素。然后对这九个子像素做加权平均。
双二次插值 bicubic 和 bicubic_clipped
这个算法是利用这个像素点的最邻近的 16个像素点进行双二次插值。这样插值出来的结果可能会超出图像的取值范围,所以有个了 bicubic_clipped 方法,这个方法会对求出来的值的范围进行限定。bicubic 对图像升采样比较有效。所谓升采样就是增大图像的像素数。
关于 bicubic 就介绍这么多吧。对于使用来说够用了。
总结
插值方法 | 质量 | 时间 | 说明 |
---|---|---|---|
nearest_neighbor | 低 | 1 | 计算时间要求很紧张的场景应用这个算法。时间评估以这个算法的计算时间为基准1。 |
bilinear | 高 | 3 | 在降采样时运行速度不能低于升采样的场景使用 |
constant | 提升降采样(图像缩小时)时效果 | 3(升采样) 10(降采样) | 可以保证降采样和升采样时图像质量接近 |
weighted | 降采样(图像缩小时)时效果最好 | 2(升采样) 20(降采样) | 在要求图像降采样后图像质量最好时用这个算法。 |
bicubic | 升采样时(图像放大)时效果最好 | 6 | 当要求图像升采样后图像质量最好时用这个算法。 |
这里再多说几句,在 Halcon 中影响计算结果的还有个系统参数 int_zooming。简单的说 int_zooming = true,插值计算时采用定点数运算,int_zooming = false 时采用浮点数。定点数计算速度较快,但是精度会低一些。对于 8 bit 图像来说,计算结果相差不大(一般相差 1 到 2 ),对于 16 位图像,定点和浮点的计算结果差别会很明显,最大可能能到 512。
几个计算示例
第一个例子是图像旋转。a 是原始图像,b 是最邻近插值,c 是双线性插值,d 是双二次插值。
第二个例子是图像方法。可以看到 最邻近插值会出现马赛克。
最后一个例子是图像缩小。很明显 constant 和 weighted 效果最好。