图像处理-最近邻&双线性缩放
前言
天才和普通人不一样的地方在于,天才可以根据A推导出C,但是普通人只能通过A推导出B,然后在推导出C。作为普通人只能多花时间,去得到天才很容易得到的推论。但是天道酬勤,心心念念,必有回响。
简介
图像缩放包含两种操作——缩小和放大。有三种经典的缩放算法,分别是最近邻插值(neareset interpolation),双线性插值(bilinear interpolation),双立方插值(bicubic interpolation)。在我的理解中,缩小和放大的操作都是,根据特定的采样算法从原图中获取像素插入到目标图像中。
假设有一张3*3大小256级的灰度图像src。
图像缩放的过程就是通过一定的采样算法从src中找到?代表的未知的像素点。下面会介绍两种缩放算法-最近邻和双线性插值。
最近邻
目标图像坐标映射到原图中的坐标公式。
srx.x = des.x*src.w/des.w
src.y = des.y*src.h/des.h
根据坐标映射公式,目标图像坐标(1,2),src.x = 1*3/4=1.33333, src.y = 2*3/4=1.5
因此des坐标(1,2)映射到src上的坐标是(1.33333,1.5)。 最邻近插值就是找到距离坐标(1.3333,1.5)最近的一点,分别对x,y进行四舍五入操作,得到最邻近的坐标为(1,2),所以des在坐标(1,2)的像素值是38。遍历des的每一个坐标点通过最邻近插值的方式找到像素点,填到des中,就会得到最终的缩放图片。
优点
- 算法简单,容易实现
- 计算速度快
缺点
- 放大后的图片有严重的马赛克情况
- 缩小后的图片会严重失真
核心代码
uint8_t* nearestNeighbor