python實(shí)現(xiàn)圖像最近鄰插值
引言:
最近鄰插值Nearest Neighbour Interpolate算法是圖像處理中普遍使用的圖像尺寸縮放算法,由于其實(shí)現(xiàn)簡(jiǎn)單計(jì)算速度快的特性深受工程師們的喜愛(ài)。
圖像插值技術(shù)是圖像超分辨率領(lǐng)域的重要研究方法之一,其目的是根據(jù)已有的低分辨率圖像(Low Resolution,LR)獲得高分辨率圖像(High Resolution,HR)。
本文一方面對(duì)最鄰近插值算法的流程進(jìn)行分析,另一方面借助python實(shí)現(xiàn)基本的最近鄰插值算法。
注:網(wǎng)上的資料有的翻譯是“近鄰”,也有的翻譯是“臨近”。
1、最近鄰插值算法思想
插值的目的是根據(jù)已知的圖像的像素值獲得未知目標(biāo)圖像的像素值,插值變換過(guò)程如下圖(PPT畫的背景沒(méi)去除)所示:

其中src表示原始圖像,tar表示插值得到的目標(biāo)圖像,H和W分別表示圖像的高度和寬度。插值的核心是找到(tar_x, tar_y)和(src_x, src_y)的映射關(guān)系,從而實(shí)現(xiàn)對(duì)目標(biāo)圖像的每一個(gè)像素點(diǎn)進(jìn)行賦值。假設(shè)目的是將原始圖像長(zhǎng)度和寬度擴(kuò)大(3,4)倍,即:
ratio_H = tar_H/src_H = tar_x/src_x = 3 ratio_W = tar_W/src_W = tar_y/src_y = 4
通過(guò)上式變形,得到目標(biāo)圖像的像素點(diǎn)和原始圖像的像素點(diǎn)映射如下:
tar_x = src_x/ratio_H tar_y = src_y/ratio_W
知道了像素點(diǎn)之間的映射關(guān)系,實(shí)現(xiàn)算法就很容易了,算法流程如下:
- (1)根據(jù)tar_H和tar_W創(chuàng)建目標(biāo)圖像
- (2)計(jì)算縮放比例因子ratio
- (3)遍歷目標(biāo)圖像每個(gè)像素點(diǎn),計(jì)算映射關(guān)系
- (4)遍歷目標(biāo)圖像每個(gè)像素點(diǎn),使用對(duì)應(yīng)原始圖像的對(duì)應(yīng)像素點(diǎn)對(duì)其賦值
2、python實(shí)現(xiàn)最鄰近插值
有了前面的理論分析就很容易實(shí)現(xiàn)了,自己實(shí)現(xiàn)中比較難理解的地方就是“坐標(biāo)變換關(guān)系”!如果是將原始圖像放大整數(shù)倍很容易理解,比如一張?jiān)?0x10圖像放大到目標(biāo)20x20圖像,那么20x20圖像中的任一個(gè)像素點(diǎn)(tar_x,tar_y)的值來(lái)自原始10x10圖像的(src_x,src_y)=int(tar_x/2, tar_y/2),也就是正好是除以2的位置;然而經(jīng)常需要放大的倍數(shù)是小數(shù)倍,比如將10x10放大到15x15,這樣(tar_x,tar_y)的值來(lái)自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)建目標(biāo)圖像
? ? target_image = np.zeros(shape=(*target_size, 3))
? ? # 2:計(jì)算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:計(jì)算目標(biāo)圖像人任一像素點(diǎn)
? ? ? ? ? ? # target_image[tar_x,tar_y]需要從原始圖像
? ? ? ? ? ? # 的哪個(gè)確定的像素點(diǎn)image[src_x, xrc_y]取值
? ? ? ? ? ? # 也就是計(jì)算坐標(biāo)的映射關(guān)系
? ? ? ? ? ? src_x = round(tar_x/alpha_h)
? ? ? ? ? ? src_y = round(tar_y/alpha_w)
? ? ? ? ? ? # 4:對(duì)目標(biāo)圖像的任一像素點(diǎn)賦值
? ? ? ? ? ? target_image[tar_x, tar_y] = image[src_x, src_y]
? ? return target_image得到的插值結(jié)果的插值結(jié)果如下:

可以看出插值以后的圖像明顯存在鋸齒效應(yīng),很多地方出現(xiàn)了“方格”。
到此這篇關(guān)于python實(shí)現(xiàn)圖像最近鄰插值的文章就介紹到這了,更多相關(guān)python圖像鄰插值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python編寫一個(gè)語(yǔ)音合成系統(tǒng)
這篇文章主要介紹了如何利用Python制作一個(gè)語(yǔ)音合成系統(tǒng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以了解一下2022-03-03
?分享一個(gè)Python?遇到數(shù)據(jù)庫(kù)超好用的模塊
這篇文章主要介紹了?分享一個(gè)Python?遇到數(shù)據(jù)庫(kù)超好用的模塊,SQLALchemy這個(gè)模塊,該模塊是Python當(dāng)中最有名的ORM框架,該框架是建立在數(shù)據(jù)庫(kù)API之上,使用關(guān)系對(duì)象映射進(jìn)行數(shù)據(jù)庫(kù)的操作,,需要的朋友可以參考下2022-04-04
Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運(yùn)算式
這篇文章主要介紹了Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運(yùn)算式,然后介紹了另外一個(gè)相關(guān)實(shí)例,具體內(nèi)容請(qǐng)參閱正文,需要的朋友可以參考下。2017-11-11
Python實(shí)現(xiàn)快速排序和插入排序算法及自定義排序的示例
這篇文章主要介紹了Python實(shí)現(xiàn)快速排序和插入排序算法及自定義排序的示例,自定義排序用到了Python的sort和sorted函數(shù),需要的朋友可以參考下2016-02-02
python用10行代碼實(shí)現(xiàn)對(duì)黃色圖片的檢測(cè)功能
這篇文章主要介紹了python用10行代碼實(shí)現(xiàn)對(duì)黃色圖片的檢測(cè)功能,涉及Python基于圖片庫(kù)PIL對(duì)圖片的檢測(cè)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法
這篇文章主要介紹了Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Tensorflow之梯度裁剪的實(shí)現(xiàn)示例
這篇文章主要介紹了Tensorflow之梯度裁剪的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

