原文:https://blog.youkuaiyun.com/mcgrady_tracy/article/details/46625367
对于图像缩放算法来说,最近临插值算法是最简单的。最近临插值算法的原理是在原图像中找到最近临的一个点,然后把这个点的像素值插入到目标图像中,最近临插值算法优点是算法简单,易于实现,但是缺点是由于相邻像素点的像素值相同,容易出现色块现象。
那么如何在原图像中找这个目标点呢,算法公式如下:
src_x = dst_x * (src_width / dst_width);
src_y = dst_y * (src_height / dst_height);
那么算出来呢,可能会是小数点,需要四舍五入取整,那么下面来看一个例子(一个3*3的矩阵):
234 38 22
67 44 12
89 65 63
这里呢,我们需要将上面的一个3*3矩阵变换成一个4*4的矩阵,我们根据上面的公式来计算一下,首先是目标点为(0,0),那么原图像的坐标点为(0,0),那么这个坐标点的值就应该为234,然后再来看(0,1)这个坐标点,那么纵坐标点还是0,但是横坐标点变成了1*(3/4) = 0.75,四舍五入得1,那么得到的原图像坐标为(0,1),那么这个坐标点值就应该为38,同理,最后得到的矩阵结果如下:
234 38 22 22
67 44 12 12
89 65 63 63
89 65 63 63
opencv已经实现了这个算法,我们可以直接使用:
import cv2 as cv
src = cv.imread('/Users/dotz/Documents/id3_b.png')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
dst = cv.resize(src,(2048,2048),interpolation=cv.INTER_NEAREST)
cv.imshow('input_image', dst)
cv.imwrite('/Users/dotz/Documents/id3_bak.png', dst)
cv.waitKey(0)
cv.destroyAllWindows()
其中interpolation=cv.INTER_NEAREST表示使用最邻近插值法,还有其他插值算法:
INTER_AREA = 3
INTER_BITS = 5
INTER_BITS2 = 10
INTER_CUBIC = 2
INTER_LANCZOS4 = 4
INTER_LINEAR = 1
INTER_LINEAR_EXACT = 5
INTER_MAX = 7
INTER_NEAREST = 0
INTER_TAB_SIZE = 32
INTER_TAB_SIZE2 = 1024