python實現(xiàn)圖像最近鄰插值
引言:
最近鄰插值Nearest Neighbour Interpolate
算法是圖像處理中普遍使用的圖像尺寸縮放算法,由于其實現(xiàn)簡單計算速度快的特性深受工程師們的喜愛。
圖像插值技術(shù)是圖像超分辨率領(lǐng)域的重要研究方法之一,其目的是根據(jù)已有的低分辨率圖像(Low Resolution,LR)獲得高分辨率圖像(High Resolution,HR)。
本文一方面對最鄰近插值算法的流程進行分析,另一方面借助python實現(xiàn)基本的最近鄰插值算法。
注:網(wǎng)上的資料有的翻譯是“近鄰”,也有的翻譯是“臨近”。
1、最近鄰插值算法思想
插值的目的是根據(jù)已知的圖像的像素值獲得未知目標圖像的像素值,插值變換過程如下圖(PPT畫的背景沒去除)所示:
其中src
表示原始圖像,tar表示插值得到的目標圖像,H和W分別表示圖像的高度和寬度。插值的核心是找到(tar_x, tar_y)和(src_x, src_y)的映射關(guān)系,從而實現(xiàn)對目標圖像的每一個像素點進行賦值。假設(shè)目的是將原始圖像長度和寬度擴大(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
知道了像素點之間的映射關(guān)系,實現(xiàn)算法就很容易了,算法流程如下:
- (1)根據(jù)tar_H和tar_W創(chuàng)建目標圖像
- (2)計算縮放比例因子ratio
- (3)遍歷目標圖像每個像素點,計算映射關(guān)系
- (4)遍歷目標圖像每個像素點,使用對應(yīng)原始圖像的對應(yīng)像素點對其賦值
2、python實現(xiàn)最鄰近插值
有了前面的理論分析就很容易實現(xiàn)了,自己實現(xiàn)中比較難理解的地方就是“坐標變換關(guān)系”!如果是將原始圖像放大整數(shù)倍很容易理解,比如一張原始10x10圖像放大到目標20x20圖像,那么20x20圖像中的任一個像素點(tar_x,tar_y)的值來自原始10x10圖像的(src_x,src_y)=int(tar_x/2, tar_y/2)
,也就是正好是除以2的位置;然而經(jīng)常需要放大的倍數(shù)是小數(shù)倍,比如將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:按照尺寸創(chuàng)建目標圖像 ? ? 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]取值 ? ? ? ? ? ? # 也就是計算坐標的映射關(guān)系 ? ? ? ? ? ? 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
得到的插值結(jié)果的插值結(jié)果如下:
可以看出插值以后的圖像明顯存在鋸齒效應(yīng),很多地方出現(xiàn)了“方格”。
到此這篇關(guān)于python實現(xiàn)圖像最近鄰插值的文章就介紹到這了,更多相關(guān)python圖像鄰插值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
?分享一個Python?遇到數(shù)據(jù)庫超好用的模塊
這篇文章主要介紹了?分享一個Python?遇到數(shù)據(jù)庫超好用的模塊,SQLALchemy這個模塊,該模塊是Python當中最有名的ORM框架,該框架是建立在數(shù)據(jù)庫API之上,使用關(guān)系對象映射進行數(shù)據(jù)庫的操作,,需要的朋友可以參考下2022-04-04Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運算式
這篇文章主要介紹了Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運算式,然后介紹了另外一個相關(guān)實例,具體內(nèi)容請參閱正文,需要的朋友可以參考下。2017-11-11Python實現(xiàn)快速排序和插入排序算法及自定義排序的示例
這篇文章主要介紹了Python實現(xiàn)快速排序和插入排序算法及自定義排序的示例,自定義排序用到了Python的sort和sorted函數(shù),需要的朋友可以參考下2016-02-02python用10行代碼實現(xiàn)對黃色圖片的檢測功能
這篇文章主要介紹了python用10行代碼實現(xiàn)對黃色圖片的檢測功能,涉及Python基于圖片庫PIL對圖片的檢測技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08Python發(fā)起請求提示UnicodeEncodeError錯誤代碼解決方法
這篇文章主要介紹了Python發(fā)起請求提示UnicodeEncodeError錯誤代碼解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04