最近邻插值
最近邻插值原理:
使用最近邻插值:
源图片(simg)=目标图片(dimg)*缩放系数(k),
缩放系数k = 源图片尺寸/目标图片
由上,对图片分x、y轴 :sx = dx*k sy = dy *k
思路:初始化目标size的图片,然后根据位置计算目标图片对应于原图片的位置索引,索引结果四舍五入
也就是说目标图片的每个像素都是根据目标图片的像素索引*缩放系数后求得目标图片对应其在源图片上的索引位置,索引结果四舍五入
最近邻插值也就是目标图片的每个像素依赖于源图片的像素值通过缩放系数计算得到的索引,并索引源图片的像素值来填充
1 import matplotlib.pyplot as plt 2 import numpy as np 3 4 img = plt.imread('source.bmp') 5 6 def nearest_interploat(img,dsize): 7 """ 8 对单通道的图片进行缩放处理 9 使用最近邻插值:源图片(simg)=目标图片(dimg)*缩放系数(k),缩放系数k = 源图片尺寸/目标图片 10 由上,对图片分x、y轴 :sx = dx*k sy = dy *k 11 思路:初始化目标size的图片,然后根据位置计算目标图片对应于原图片的位置索引,索引结果四舍五入 12 也就是说目标图片的每个像素都是根据目标图片的像素索引*缩放系数后求得目标图片对应其在源图片上的索引位置,索引结果四舍五入 13 最近邻插值也就是目标图片的每个像素依赖于源图片的像素值通过缩放系数计算得到的索引,并索引源图片的像素值来填充 14 :param img: 源图片 15 :param dsize: 目标尺寸 16 :return: 目标图片 17 """ 18 19 dimg = np.zeros((dsize),dtype=int) #初始化目标图片 20 ssize_x,ssize_y = img.shape 21 plt.imshow(dimg) 22 plt.show() 23 #下面将dsize分开处理为x的缩放系数与y的缩放系数是因为图像的高宽可能不一致 24 xk = (ssize_x/dsize[0]) 25 yk = (ssize_y/dsize[1]) 26 27 # np.argwhere(dimg!=None)返回目标图片的像素索引 shape=(dsize_x*disze_y,2)因为每个像素点都有x,y两个索引 28 pixel_index=np.argwhere(dimg!=None) #返回的索引每个像素点[行,列]像素点从行到列 29 30 31 d_ssize_x = pixel_index[:,0]*xk 32 33 d_ssize_y = pixel_index[:,1] *xk 34 35 36 d_ssize_x = np.around(d_ssize_x) #四舍五入 37 d_ssize_y = np.around(d_ssize_y) 38 39 40 d_ssize_x=d_ssize_x.astype('int') 41 d_ssize_y=d_ssize_y.astype('int') 42 43 d_ssize_x[np.nonzero(d_ssize_x==ssize_x)[0]] = ssize_x-1 #索引不得超过size-1 44 d_ssize_y[np.nonzero(d_ssize_y==ssize_y)[0]] = ssize_y-1 45 46 print(d_ssize_x[np.nonzero(d_ssize_x>ssize_x)[0]]) 47 dimg = img[d_ssize_x,d_ssize_y] 48 dimg = np.resize(dimg,dsize) 49 print(img.shape) 50 plt.imshow(img) 51 plt.show() 52 53 plt.imshow(dimg) 54 plt.show() 55 56 57 58 59 60 if __name__ == '__main__': 61 c =50 62 nearest_interploat(img[:,:,2],(176*c,197*c)) 63 a = np.random.rand(2,3)