计算机视觉基础:图像处理(上)
task1 图像插值算法-图像缩放
最近邻插值算法
最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输出。
举个简单例子:
3 × 3的一张灰度图 (像素取值代表亮度,范围是0-255,越高越亮,即255白色,0黑色)
假定像素矩阵如下:
0 22 55
33 99 65
156 240 3
将这张图片放大到4×4个像素:
? ? ? ?
? ? ? ?
? ? ? ?
? ? ? ?
相应位置上的像素根据给出的公式计算:
srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
目标图像(0,0)处灰度取值(0×3/4,0×3/4)=(0,0)即取源图像(0,0)处灰度
dst(0,1)=src(0,0.75)
计算机图像中像素已经是最小单位了,没有小数点,离哪近取哪。
放大效果:
相比原图有一种模糊感,有马赛克的感觉。
缩小效果:
有失真的感觉,不清晰,总之不好使。
双线性插值算法
先看看效果
放大图:
相比最邻近插值算法的放大图,没有了块状的感觉。
缩小图:
总觉得有一种雾蒙蒙的感觉。
双线性插值就是线性插值在二维时的推广,在两个方向上做三次线性插值,具体操作如下图所示:
首先在x方向上进行两次线性插值:
化简后:
然后在y方向上进行一次线性插值:
化简并带入:
通过一篇博客了解到计算目标图像坐标对应源图像坐标时应这样计算:
SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5
SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5
计算过程:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。
记录下函数原型
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数:
| 参数 | 描述 | |–|--| | src | 【必需】原图像 | | dsize | 【必需】输出图像所需大小 | | fx | 【可选】沿水平轴的比例因子 | | fy | 【可选】沿垂直轴的比例因子 | | interpolation | 【可选】插值方式 |
插值方式: | | | |–|--| | cv.INTER_NEAREST | 最近邻插值 | | cv.INTER_LINEAR | 双线性插值 | | cv.INTER_CUBIC | 基于4x4像素邻域的3次插值法 | | cv.INTER_AREA | 基于局部像素的重采样 |
通常,缩小使用cv.INTER_AREA,放缩使用cv.INTER_CUBIC(较慢)和cv.INTER_LINEAR(较快效果也不错)。默认情况下,所有的放缩都使用cv.INTER_LINEAR**