用最近邻插值(Nearest Neighbor interpolation)进行图片缩放
Posted tugouxp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用最近邻插值(Nearest Neighbor interpolation)进行图片缩放相关的知识,希望对你有一定的参考价值。
图片缩放的两种常见算法:
- 最近邻域内插法(Nearest Neighbor interpolation)
- 双向性内插法(bilinear interpolation)
本文主要讲述最近邻插值(Nearest Neighbor interpolation算法的原理以及python实现
基本原理
最简单的图像缩放算法就是最近邻插值。顾名思义,就是将目标图像各点的像素值设为源图像中与其最近的点。算法优点在与简单、速度快。
如下图所示,一个4*4的图片缩放为8*8的图片。步骤:
- 生成一张空白的8*8的图片,然后在缩放位置填充原始图片值(可以这么理解)
- 在图片的未填充区域(黑色部分),填充为原有图片最近的位置的像素值。
实现代码:
import cv2
import numpy as np
def nearest_neighbor_resize(img, new_w, new_h):
# height and width of the input img
h, w = img.shape[0], img.shape[1]
# new image with rgb channel
ret_img = np.zeros(shape=(new_h, new_w, 3), dtype='uint8')
# scale factor
s_h, s_c = (h * 1.0) / new_h, (w * 1.0) / new_w
# insert pixel to the new img
for i in range(new_h):
for j in range(new_w):
p_x = int(j * s_c)
p_y = int(i * s_h)
ret_img[i, j] = img[p_y, p_x]
return ret_img
img_path = './dice.jpg'
img = cv2.imread(img_path)
#ret_img = nearest_neighbor_resize(img, 222, 220)
ret_img = nearest_neighbor_resize(img, 640, 480)
cv2.imshow("source image", img)
cv2.imshow("after bilinear image", ret_img)
cv2.waitKey()
cv2.destroyAllWindows()
将一个96*96的图像经过算法转换,变成了一张640*480的图像。
放大到1920*1080
缩小,从892*650->96*96
以上介绍的是最邻近域内插法,实际的媒体处理SOC中,VPU(VE),DE(Display Engine),G2D(2D Graphic accelerator)都具备图像缩放的能力,各自实现的算法不同,但都是基于这两种基础算法,比如AW的VPU,基于的就是双线性内插法实现的图片放大缩小.
至于放大出现锯齿,得看你放多大,1.5倍内的图像质量还是有保证的,再大点出现锯齿也不足为奇,缩放比例算法是不限制的. 可以很大,也可以很小,不一定要求倍数比例缩放.缩略图一般有限制,但是视频都是无级缩放.
结束!
以上是关于用最近邻插值(Nearest Neighbor interpolation)进行图片缩放的主要内容,如果未能解决你的问题,请参考以下文章
机器学习实战☛k-近邻算法(K-Nearest Neighbor, KNN)
机器学习之Javascript篇: 近邻(k-nearest-neighbor) 算法介绍
机器学习实战☛k-近邻算法(K-Nearest Neighbor, KNN)