圖像最近鄰插值算法


一. 最近鄰插值法放大圖像:

        最近鄰插值法在放大圖像時補充的像素是最近鄰的像素的值。由於方法簡單,所以處理速度很快,但是放大圖像畫質劣化明顯,常常含有鋸齒邊緣。


最近鄰插值法算法原理 ↑
 

二. 最近鄰插值法算法流程:

        插值法放大圖像的第一步都是相同的,計算新圖的坐標點像素值對應原圖中哪個坐標點的像素值來填充,計算公式為:

        srcX = dstX * (srcWidth/dstWidth)

        srcY = dstY * (srcHeight/dstHeight)

        其中,src表示舊圖,dst表示新圖。新圖的坐標(dstX,dstY)對應於舊圖的坐標(srcX,srcY)。 srcWidth/dstWidth 和 srcHeight/dstHeight 分別表示寬和高的放縮比。

        那么問題來了,通過這個公式算出來的 srcX,scrY (舊圖坐標)有可能是小數,但是坐標點是不存在小數的,都是整數,得想辦法把它轉換成整數才行。

        不同插值法的區別就體現在 srcX,scrY 是小數時,怎么變成整數去取原圖像中的像素值。

        最近鄰插值法:看名字就很直白,四舍五入選取最接近的整數。這樣的做法會導致像素的變化不連續,在新圖中會產生鋸齒。


三. 實驗 python實現最近鄰插值算法

 1 from PIL import Image
 2 import matplotlib.pyplot as plt
 3 import numpy as np 
 4 import math
 5 
 6 # 最近鄰插值算法
 7 # dstH為新圖的高;dstW為新圖的寬
 8 def NN_interpolation(img,dstH,dstW):
 9     scrH,scrW,_=img.shape
10     retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)
11     for i in range(dstH-1):
12         for j in range(dstW-1):
13             scrx=round(i*(scrH/dstH))
14             scry=round(j*(scrW/dstW))
15             retimg[i,j]=img[scrx,scry]
16     return retimg
17 
18 im_path='../paojie.jpg'
19 image=np.array(Image.open(im_path))
20 
21 image1=NN_interpolation(image,image.shape[0]*2,image.shape[1]*2)
22 image1=Image.fromarray(image1.astype('uint8')).convert('RGB')
23 image1.save('out.png')

 


四. 實驗結果:


原圖 ↑
 
 

最近鄰插值后圖像 ↑
 

        可以看到新圖中產生了鋸齒狀的邊緣。


五. 參考內容:

  https://www.jianshu.com/p/4954643f7514


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM