图像像素画生成方法总结(图像下采样)
图片的上采样和下采样分别对应图片的放大和缩小,在对图像进行采样的过程中会造成不同程度的模糊。图像的像素画生成采用的方法就是图片下采用的方法。本文会对图像像素化的方法进行总结。
传统的插值方法
首先,从OpenCV
中的cv2.resize()
中所采用的方法来看,传统的图片采样方法主要分为以下几种
(括号中为在OpenCV
中的插值Flag): 1. Nearest Neighbor
(INTER_NEAREST) 2. Linear Interpolation (INTER_LINEAR) 3. Bicubic
Interpolation (INTER_CUBIC) 4. Area Interpolation (INTER_AREA) 5.
Lanczos interpolation (INTER_LANCZOS4)
我们定义一张图片为一个ndarray
,image width \(= W\), image height \(= H\),
所以image.shape = (W, H, 3)
, 目标图片的image width \(= TW\), image height \(= TH\),
output.shape = (TW, TH, 3)
。得出长和宽的缩放比分别为\(TW/W, TH/H\)。 ## 最近插值 (Nearest
Neighbor)
最简单直观的一种插值方法。只需要从目标图像的坐标映射到原图像后,找到临近的坐标即可。比如对于target
image的\((i,j)\)像素,映射到原图像上就是\((i\times\frac{W}{TW},
j\times\frac{H}{TH})\),然后四舍五入就是对应的原图像的像素坐标。
线性插值 (Linear Interpolation)
比较常见的插值算法。得到原图像上对应的坐标后,使用双线性插值,得到对应的像素值。下图为双线性插值的示意图。 ## 双三次插值 (Bicubic Interpolation) 双三次插值就更加复杂一些。比起线性插值的根据周围四个点进行插值,双三次插值需要用到周围的16个点进行加权。使用的插值公式也不是线性的,而是一个三次方程。 ## 区域插值法 (Area Interpolation) Area Interpolation对我个人来说实际上更加符合直觉,也就是根据图片的缩放比,找到生成的目标的图像所对应的一块区域,对该区域进行加权平均,事实上这种方法在缩放普通图像的时候感觉能够较好的保留原本图像的特征,缺点就是边缘会显得非常模糊,所以不是很利于对图像进行像素化。 ## Lanczos重采样 Lanczos在形式上和双三次插值有着相似之处,通过一个内核函数计算每个像素对应的权重。Lanczos resampling-维基百科。
其他进行像素画的方法
除了传统的插值方法,还有以下几种方法进行图片下采样生成像素画。 1. Content-Adaptive 2 2. Perceptual based downscaling 3 3. Image Abstraction Method 4 4. Deep Unsupervised Downscaling 5,使用深度学习GAN的方式进行图片生成,可以较好的保留图片的边缘,减少由于边界所造成的模糊效果。