最近鄰插值原理:
使用最近鄰插值:
源圖片(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)