首頁 > 軟體

python實現影象最近鄰插值

2022-03-10 13:01:18

引言:

最近鄰插值Nearest Neighbour Interpolate演演算法是影象處理中普遍使用的影象尺寸縮放演演算法,由於其實現簡單計算速度快的特性深受工程師們的喜愛。

影象插值技術是影象超解析度領域的重要研究方法之一,其目的是根據已有的低解析度影象(Low Resolution,LR)獲得高解析度影象(High Resolution,HR)。

本文一方面對最鄰近插值演演算法的流程進行分析,另一方面藉助python實現基本的最近鄰插值演演算法。

注:網上的資料有的翻譯是“近鄰”,也有的翻譯是“臨近”。

1、最近鄰插值演演算法思想

插值的目的是根據已知的影象的畫素值獲得未知目標影象的畫素值,插值變換過程如下圖(PPT畫的背景沒去除)所示:

其中src表示原始影象,tar表示插值得到的目標影象,H和W分別表示影象的高度和寬度。插值的核心是找到(tar_x, tar_y)和(src_x, src_y)的對映關係,從而實現對目標影象的每一個畫素點進行賦值。假設目的是將原始影象長度和寬度擴大(3,4)倍,即:

ratio_H = tar_H/src_H = tar_x/src_x = 3
ratio_W = tar_W/src_W = tar_y/src_y = 4

通過上式變形,得到目標影象的畫素點和原始影象的畫素點對映如下:

tar_x = src_x/ratio_H
tar_y = src_y/ratio_W

知道了畫素點之間的對映關係,實現演演算法就很容易了,演演算法流程如下:

  • (1)根據tar_H和tar_W建立目標影象
  • (2)計算縮放比例因子ratio
  • (3)遍歷目標影象每個畫素點,計算對映關係
  • (4)遍歷目標影象每個畫素點,使用對應原始影象的對應畫素點對其賦值

2、python實現最鄰近插值

有了前面的理論分析就很容易實現了,自己實現中比較難理解的地方就是“座標變換關係”!如果是將原始影象放大整數倍很容易理解,比如一張原始10x10影象放大到目標20x20影象,那麼20x20影象中的任一個畫素點(tar_x,tar_y)的值來自原始10x10影象的(src_x,src_y)=int(tar_x/2, tar_y/2),也就是正好是除以2的位置;然而經常需要放大的倍數是小數倍,比如將10x10放大到15x15,這樣(tar_x,tar_y)的值來自10x10影象中(src_x, src_y)=int(tar_x/1.5, tar_y/1.5)。

程式碼如下:

def nearest(image, target_size):
    """
    Nearest Neighbour interpolate for RGB  image
    
    :param image: rgb image
    :param target_size: tuple = (height, width)
    :return: None
    """
    if target_size[0] < image.shape[0] or target_size[1] < image.shape[1]:
        raise ValueError("target image must bigger than input image")
    # 1:按照尺寸建立目標影象
    target_image = np.zeros(shape=(*target_size, 3))
    # 2:計算height和width的縮放因子
    alpha_h = target_size[0]/image.shape[0]
    alpha_w = target_size[1]/image.shape[1]

    for tar_x in range(target_image.shape[0]-1):
        for tar_y in range(target_image.shape[1]-1):
            # 3:計算目標影象人任一畫素點
            # target_image[tar_x,tar_y]需要從原始影象
            # 的哪個確定的畫素點image[src_x, xrc_y]取值
            # 也就是計算座標的對映關係
            src_x = round(tar_x/alpha_h)
            src_y = round(tar_y/alpha_w)

            # 4:對目標影象的任一畫素點賦值
            target_image[tar_x, tar_y] = image[src_x, src_y]

    return target_image

得到的插值結果的插值結果如下:

可以看出插值以後的影象明視訊記憶體在鋸齒效應,很多地方出現了“方格”。

到此這篇關於python實現影象最近鄰插值的文章就介紹到這了,更多相關python影象鄰插值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com