圖像雙線性插值演算法
❶ 對圖像進行雙線性插值演算法後,圖像出現塊效應怎麼解決
interpolation 插值方法,類似於 CV_INTER_NN 方法。當圖像放大時,dst 輸出圖像,該方法可以避免波紋出現。當圖像縮小時候;
src 輸入圖像,
CV_INTER_LINEAR - 雙線性插值 (預設使用)
CV_INTER_AREA - 使用象素關系重采樣.
該方法就是用於將圖像改變為dst定義的大小..
CV_INTER_CUBIC - 立方插值, CvArr* dstvoid cvResize( const CvArr* src,然後根據你選擇的插值方法進行插值, int interpolation=CV_INTER_LINEAR ):
CV_INTER_NN - 最近鄰插值.
❷ 【圖像處理】雙線性插值法擴展圖像像素及其代碼實現(亞像素)
提升圖像精度的藝術:亞像素插值法深度解析
在數字圖像處理的世界裡,你是否曾好奇如何在不改動硬體的前提下,提升我們日常處理的圖像精度?讓我們一起探索一個可能的解決方案——亞像素圖像,它就像圖像的隱形擴展,通過數學魔法提升細節表現。
想像一下,一張實際尺寸為8cm x 8cm的精美圖片,被計算機壓縮成只有4 x 4個像素的版本。每個像素代表的實際上是現實中的2cm x 2cm區域,這種粗獷的采樣會導致圖像模糊,無法充分捕捉圖像的細微特徵。因為每個像素只能固定一種顏色,我們渴望的是一種能夠精細呈現細節的圖像處理方式。
亞像素的誕生
解決這個問題的答案就隱藏在亞像素的概念里。它並非簡單的像素堆砌,而是在像素點之間巧妙添加新點,通過數學運算(如插值)創造更精細的圖像。亞像素圖像就像是在原始像素網上的精雕細琢,通過雙線性插值,我們在每個像素點間生成了新的像素,從而增加了解析度,提高了測量的精度。
雙線性插值的力量
雙線性插值,如魔術般在圖像的像素點間編織新的線條。首先,它在Q11和Q21之間進行線性插值,得到中點R1,接著在R1與R2之間進行二次插值,從而誕生新像素點P。這個過程就像在二維坐標系中繪制一條連續的路徑,每一步都旨在捕捉到圖像的細微變化。
計算公式看似復雜,實則遵循了一個簡單的道理:在兩點間找到中點,然後逐步延伸。將這個原理應用到實際的像素值計算中,我們就能得到更加細膩的圖像表現。
代碼實踐:雙線性插值實戰
在代碼的世界裡,我們通過讀取圖像、設置參數,然後對每個像素點進行預處理和插值計算。通過逐行、逐列的處理,雙線性插值法為每個亞像素位置賦予了獨特的色彩,提升圖像的解析度。
然而,這只是軟體層面的提升,實際應用時,結合相機標定和深度信息至關重要。亞像素化後的圖像測量,需要將像素值轉換為實際尺寸,這是精度提升後的關鍵步驟。
總結與局限
亞像素圖像處理為測量精度提供了新的可能,但它並非萬能良葯。在選擇使用時,我們必須考慮實際應用場景和硬體限制。盡管軟體演算法的進步顯著,但我們仍需明智地權衡,找到最適合的解決方案,讓圖像處理的精度提升在每個領域都能發揮出最佳效果。
❸ 鍥劇墖鏀懼ぇ綆楁硶
鍥懼儚鏀懼ぇ鏈夎稿氱畻娉曪紝鍏跺叧閿鍦ㄤ簬瀵規湭鐭ュ儚緔犱嬌鐢ㄤ綍縐嶆彃鍊兼柟寮忋備互涓嬫垜浠灝嗗叿浣撳垎鏋愬嚑縐嶅父瑙佺殑綆楁硶錛岀劧鍚庝粠鏀懼ぇ鍚庣殑鍥懼儚鏄鍚﹀瓨鍦ㄨ壊褰╁け鐪燂紝鍥懼儚鐨勭粏鑺傛槸鍚﹀緱鍒拌緝濂界殑淇濆瓨錛屾斁澶ц繃紼嬫墍闇鏃墮棿鏄鍚﹀垎閰嶅悎鐞嗙瓑澶氭柟闈㈡潵姣旇緝瀹冧滑鐨勪紭鍔c
褰撴妸涓涓灝忓浘鍍忔斁澶х殑鏃跺欙紝姣斿傛斁澶400%錛屾垜浠鍙浠ラ栧厛渚濇嵁鍘熸潵鐨勭浉閭4涓鍍忕礌鐐圭殑鑹插僵鍊礆紝鎸夌収鏀懼ぇ鍊嶆暟鎵懼埌鏂扮殑ABCD鍍忕礌鐐圭殑浣嶇疆騫惰繘琛屽瑰簲鐨勫~鍏咃紝浣嗘槸瀹冧滑涔嬮棿瀛樺湪鐨勫ぇ閲忕殑鍍忕礌鐐癸紝姣斿俻鐐圭殑鑹插僵鍊煎嵈鏄涓嶅彲鐭ョ殑錛岄渶瑕佽繘琛屼及綆椼
鏈閭昏繎鐐規彃鍊肩畻娉曟槸鏈綆鍗曚篃鏄閫熷害鏈蹇鐨勪竴縐嶇畻娉曪紝鍏跺仛娉曟槸灝嗘斁澶у悗鏈鐭ョ殑鍍忕礌鐐筆錛屽皢鍏朵綅緗鎹㈢畻鍒板師濮嬪獎鍍忎笂錛屼笌鍘熷嬬殑閭昏繎鐨4鍛ㄥ儚緔犵偣A,B,C,D鍋氭瘮杈冿紝浠P鐐圭殑鍍忕礌鍊肩瓑浜庢渶闈犺繎鐨勯偦榪戠偣鍍忕礌鍊煎嵆鍙銆傚備笂鍥句腑鐨凱鐐癸紝鐢變簬鏈鎺ヨ繎D鐐癸紝鎵浠ュ氨鐩存帴鍙朠=D銆
榪欑嶆柟娉曚細甯︽潵鏄庢樉鐨勫け鐪熴傚湪A,B涓鐐瑰勭殑鍍忕礌鍊間細紿佺劧鍑虹幇涓涓璺寵穬錛岃繖灝辨槸鍑虹幇椹璧涘厠鍜岄敮榻跨瓑鏄庢樉璧版牱鐨勫師鍥犮傛渶涓磋繎鎻掑兼硶鍞涓鐨勪紭鐐瑰氨鏄閫熷害蹇銆
鍏跺仛娉曟槸灝嗘斁澶у悗鏈鐭ョ殑鍍忕礌鐐筆錛屽皢鍏朵綅緗鎹㈢畻鍒板師濮嬪獎鍍忎笂錛岃$畻鐨勫洓涓鍍忕礌鐐笰,B,C,D瀵筆鐐圭殑褰卞搷(瓚婇潬榪慞鐐瑰彇鍊艱秺澶э紝琛ㄦ槑褰卞搷涔熻秺澶)錛屽叾紺烘剰鍥懼備笅銆
鍏跺叿浣撶殑綆楁硶鍒嗕笁姝ワ細
絎涓姝ユ彃鍊艱$畻鍑篈B涓ょ偣瀵筆鐐圭殑褰卞搷寰楀埌e鐐圭殑鍊箋
瀵圭嚎鎬ф彃鍊肩殑鐞嗚В鏄榪欐牱鐨勶紝瀵逛簬AB涓ゅ儚緔犵偣涔嬮棿鐨勫叾瀹冨儚緔犵偣鐨勮壊褰╁礆紝璁ゅ畾涓虹洿綰垮彉鍖栫殑錛岃佹眰e鐐瑰勭殑鍊礆紝鍙闇瑕佹壘鍒板瑰簲浣嶇疆鐩寸嚎涓婄殑鐐瑰嵆鍙銆傛崲鍙ヨ瘽璇達紝A,B闂翠換鎰忎竴鐐圭殑鍊煎彧璺烝,B鏈夊叧銆
絎浜屾ワ紝鎻掑艱$畻鍑篊D涓ょ偣瀵筆鐐圭殑褰卞搷寰楀埌f鐐圭殑鍊箋
絎涓夋ワ紝鎻掑艱$畻鍑篹f涓ょ偣瀵筆鐐圭殑褰卞搷鍊箋
鍙岀嚎鎬ф彃鍊肩畻娉曠敱浜庢彃鍊肩殑緇撴灉鏄榪炵畫鐨勶紝鎵浠ヨ嗚変笂浼氭瘮鏈閭昏繎鐐規彃鍊肩畻娉曡佸ソ涓浜涳紝涓嶈繃榪愮畻閫熷害紼嶅井瑕佹參涓鐐癸紝濡傛灉璁茬┒閫熷害錛屾槸涓涓涓嶉敊鐨勬姌琛楓
鍙岀珛鏂規彃鍊肩畻娉曚笌鍙岀嚎鎬ф彃鍊肩畻娉曠被浼礆紝瀵逛簬鏀懼ぇ鍚庢湭鐭ョ殑鍍忕礌鐐筆錛屽皢瀵瑰叾褰卞搷鐨勮寖鍥存墿澶у埌閭昏繎鐨16涓鍍忕礌鐐癸紝渚濇嵁瀵筆鐐圭殑榪滆繎褰卞搷榪涜屾彃鍊艱$畻錛屽洜P鐐圭殑鍍忕礌鍊間俊鎮鏉ヨ嚜16涓閭昏繎鐐癸紝鎵浠ュ彲寰楀埌杈冪粏鑷寸殑褰卞儚錛屼笉榪囬熷害姣旇緝鎱銆
涓嶈繃鍙岀珛鏂規彃鍊肩畻娉曚笌鍙岀嚎鎬ф彃鍊肩畻娉曠殑鏈璐ㄥ尯鍒涓嶄粎鍦ㄤ簬鎵╁ぇ浜嗗獎鍝嶇偣鐨勮寖鍥達紝榪橀噰鐢ㄩ珮綰х殑鎻掑肩畻娉曪紝濡傚浘鎵紺
瑕佹眰A錛孊涓ょ偣涔嬮棿e鐐圭殑鍊礆紝闇瑕佸埄鐢ˋ,B鍛ㄥ洿A-1,A,B,B 1鍥涗釜鐐圭殑鍍忕礌鍊礆紝閫氳繃鏌愮嶉潪綰挎х殑璁$畻錛屽緱鍒板厜婊戠殑鏇茬嚎錛屼粠鑰岀畻鍑篹鐐圭殑鍊兼潵銆
鎵璋撯滃弻鈥濇垨鑰呭彨鈥滀簩嬈♀濈殑鎰忔濆氨鏄鍦ㄨ$畻浜嗘í鍚戞彃鍊煎獎鍝嶇殑鍩虹涓婏紝鎶婁笂榪拌繍綆楁嫇灞曞埌浜岀淮絀洪棿錛屽啀璁$畻綰靛悜鎻掑煎獎鍝嶇殑鎰忔濄
鍙岀珛鏂規彃鍊肩畻娉曡兘澶熷緱鍒扮浉瀵規竻鏅扮殑鐢婚潰璐ㄩ噺錛屼笉榪囪$畻閲忎篃鍙樺ぇ銆傝ョ畻娉曞湪鐜板湪鐨勪紬澶氬浘鍍忓勭悊杞浠朵腑鏈涓哄父鐢錛屾瘮濡侾hotoshop,After Effects,Avid,Final Cut Pro絳夈
涓轟簡寰楀埌鏇村ソ鐨勫浘鍍忚川閲忥紝鍦ㄤ互涓婄殑鍩虹涓婏紝璁稿氭柊鐨勭畻娉曚笉鏂娑岀幇錛屽畠浠浣跨敤浜嗘洿鍔犲嶆潅鐨勬敼榪涚殑鎻掑兼柟寮忋傝濡侭鏍鋒潯錛圔-SPline錛, 綾沖垏灝旓紙Mitchell錛夌瓑鎻掑肩畻娉曪紝瀹冧滑鐨勭洰鐨勬槸浣挎彃鍊肩殑鏇茬嚎鏄懼緱鏇村鉤婊戱紝鍥懼儚杈圭紭鐨勮〃鐜版洿鍔犲畬緹庛
涓庝笂榪扮粡鍏哥殑鎻掑兼柟娉曟渶澶х殑鍖哄埆鍦ㄤ簬錛 S-Spline 閲囩敤浜嗕竴縐嶈嚜閫傚簲鎶鏈錛岄偅浜涗紶緇熺殑鏂規硶鎬繪槸渚濇嵁鍛ㄥ洿鐨勫儚緔犵偣鏉ユ眰鏈鐭ョ偣鐨勮壊褰╁礆紝涔熷氨鏄璇撮渶瑕佹眰瑙g殑鑹插僵鍊間粎浠呬緷闈犺ュ儚緔犵偣鍦ㄥ浘鍍忎腑鐨勪綅緗錛岃岄潪瀹為檯鐨勫浘鍍忕殑鍍忕礌淇℃伅錛岃岃嚜閫傚簲鏍鋒潯綆楁硶榪樹細鑰冭檻瀹為檯鍥懼儚鐨勫儚緔犱俊鎮銆 瀹為獙琛ㄦ槑錛岀粡榪 S-Spline 綆楁硶寰楀埌鐨勫浘鍍忔晥鏋滆佷紭浜庡弻絝嬫柟鎻掑肩畻娉曘
鐜板湪 S-Spline 綆楁硶鍙堝嚭鐜頒簡澧炲己鐗 S-Spline XL錛屾柊鐗堟湰鐨 S-Spline XL 綆楁硶杈 S-Spline 鑰岃█鐢婚潰鐨勯攼搴﹀緱鍒拌繘涓姝ュ炲己錛岀墿浣撶殑杞寤撴洿鍔犳竻鏅幫紝杈圭紭鐨勯敮榻跨幇璞″ぇ澶у噺寮憋紝鍥懼儚鎰熷彈鏇村姞鑷鐒躲
鐜板湪鎴戜滑鏉ュ逛互涓婂嚑縐嶆彃鍊肩畻娉曡繘琛屽疄闄呮祴璇曪紝鐪嬬湅瀹冧滑鐨勬晥鏋溿傞栧厛鎵撳紑鍘熷嬬殑鍥懼儚bird.jpg.榪欐槸涓涓鍒嗚鯨鐜囦負360脳270鐨勫浘鍍忋
鎴戜滑閲囩敤 BenVista 鍏鍙歌憲鍚嶇殑 PhotoZoom Pro 2 杞浠訛紝鍦╬c鐢佃剳涓婅繘琛屾祴璇曪紝鐢佃剳鐨凜PU閰嶇疆涓篒nter Core 2 T5500 1.66GHz,鍒嗗埆閲囩敤浠ヤ笂5縐嶆彃鍊兼柟娉曟妸鍘熷嬪浘鍍忔斁澶8鍊嶅緱鍒5涓2880脳2160鐨勫浘鍍
瀵規瘮浠ヤ笂鍚勫浘騫剁粨鍚堝疄楠屾暟鎹錛屾垜鎶婃晥鏋滃弬鏁板垪涓懼備笅琛ㄣ
❹ 常見圖像插值演算法只有3種么
電腦攝像頭最高只有130萬像素的,800萬是通過軟體修改的。
何為數碼插值(軟體插值)
插值(Interpolation),有時也稱為「重置樣本」,是在不生成像素的情況下增加圖像像素大小的一種方法,在周圍像素色彩的基礎上用數學公式計算丟失像素的色彩。簡單地說,插值是根據中心像素點的顏色參數模擬出周邊像素值的方法,是數碼相機特有的放大數碼照片的軟體手段。
一、認識插值的演算法
「插值」最初是電腦術語,後來引用到數碼圖像上來。圖像放大時,像素也相應地增加,但這些增加的像素從何而來?這時插值就派上用場了。插值就是在不生成像素的情況下增加圖像像素大小的一種方法,在周圍像素色彩的基礎上用數學公式計算丟失像素的色彩(也有些相機使用插值,人為地增加圖像的解析度)。所以在放大圖像時,圖像看上去會比較平滑、干凈。但必須注意的是插值並不能增加圖像信息。以圖1為原圖(見圖1),以下是經過不同插值演算法處理的圖片。
1.最近像素插值演算法
最近像素插值演算法(Nearest Neighbour Interpolation)是最簡單的一種插值演算法,當圖片放大時,缺少的像素通過直接使用與之最接近的原有像素的顏色生成,也就是說照搬旁邊的像素,這樣做的結果是產生了明顯可見的鋸齒(見圖2)。
2.雙線性插值演算法
雙線性插值演算法(Bilinear Interpolation)輸出的圖像的每個像素都是原圖中四個像素(2×2)運算的結果,這種演算法極大程度上消除了鋸齒現象(見圖3)。 3.雙三次插值演算法
雙三次插值演算法(Bicubic Interpolation)是上一種演算法的改進演算法,它輸出圖像的每個像素都是原圖16個像素(4×4)運算的結果(見圖4)。這種演算法是一種很常見的演算法,普遍用在圖像編輯軟體、列印機驅動和數碼相機上。 4.分形演算法
分形演算法(Fractal Interpolation)是Altamira Group提出的一種演算法,這種演算法得到的圖像跟其他演算法相比更清晰、更銳利(見圖5)。
現在有許多數碼相機廠商將插值演算法用在了數碼相機上,並將通過演算法得到的解析度值大肆宣傳,固然他們的演算法比雙三次插值演算法等演算法先進很多,但是事實是圖像的細節不是憑空造出來的。因為插值解析度是數碼相機通過自身的內置軟體來增加圖像的像素,從而達到增大解析度的效果。
二、插值的影響
使用數碼變焦拍出來的照片不清晰,這是數碼變焦最遭人垢病的地方,事實上,這只是一種片面的說法。
數碼變焦對照片清晰度的影響有多大,取決於數碼相機在變焦時,CCD是否進行了插值運算。在使用高像素的情況下,如果採用數碼變焦進行拍攝,則此時CCD並不會有任何插值運算,數碼變焦對最終得到的數碼照片的清晰度的影響將會因此而變得極其有限。舉個例子,一台CCD像素為520萬、最大解析度為2560×1920的數碼相機,如果採用2×的數碼變焦來進行拍攝的話,那麼成像過程中只會有一半CCD在工作。換句話說,數碼相機並不會使用類似「在一個像素點周圍添加八個像素點」的插值演算法進行成像,而是通過降低解析度的方法,即1280×960這個解析度指標來進行成像。對於一般的數碼照片來說,1280×960這個解析度指標已經足夠優秀了,它與2560×1920解析度的差別將會因為沒有插值運算的參與而變得可以接受。不過這種現象只限於某些比較高級的數碼相機,對於那些千元以下的定焦數碼相機來說,使用數碼變焦就意味著必然的插值運算,犧牲解析度的後果使得照片拍攝者只能有兩個選擇:要麼得到一張模糊不清的「全尺寸」照片、要麼得到一張質量可以保證但解析度只有類似320×240這樣的「迷你」照片。
❺ GPU上圖像拼接的快速計算
圖像拼接已被研究並廣泛應用於計算機科學的許多領域,但在特徵匹配、扭曲和混合步驟中存在大量計算。從而無法滿足某些應用的實時性需求。幸運的是,已經在圖形處理器單元 (GPU) 上開發並實現了一些可以加快拼接過程的相關並行操作。在本文中,我們使用統一計算設備架構 (CUDA) 提出了基於 GPU 的圖像拼接的並行實現。我們在執行時間方面獲得了比在中央處理單元 (CPU) 上實現更好的結果。在實驗中使用集成 GPU GTX745 時,我們對大輸入圖像實現了高達 27.6 倍的加速比。
典型的拼接過程主要包括三個不同的圖像處理步驟,即配准、扭曲和插值以及混合。圖像配準是圖像拼接的關鍵任務。配準是指在描繪同一場景的一對圖像之間建立幾何變換,該變換由一個8自由度的平面單應性決定。
GPU以其強大的並行計算能力吸引許多領域的研究,作為一種協處理器對計算量大的演算法加速已成為實踐的重要途徑。在前人的研究中,他們都避免了考慮兩個極其耗時的步驟,即特徵匹配和隨機樣本共識(RANSAC)。作為圖像配准中的兩個關鍵過程,在提出的 GPU 加速並行演算法中應考慮它們。
使用GPU並行計算會遇到兩個限制
CUDA的出現解決了上述問題,並且CUDA使用C語言,最初為CPU編寫的C語言函數可以移植到CUDA內核,無需修改。
在CUDA中,一定數量的線程被分組到一個塊中,一定數量的塊以規則的網格模式在邏輯上排列(見圖1)。每個塊都映射到一個多處理器,一個多處理器可以同時運行多個線程塊。由於本地資源(寄存器和共享內存)在塊之間進行劃分,包含在同一塊中的線程可以訪問相同的共享內存並快速實現同步操作。但是,不同塊中的線程並不能直接實現通信和同步。除了本地寄存器和共享內存,所有線程都可以訪問全局內存、常量內存和紋理內存。
A. 特徵匹配
令點 經過仿射變換後得到 ,即
向量 是平移分量, 控制縮放、旋轉效果。利用齊次坐標系,方程(2)也可以寫為
接著計算兩幅圖像特徵點之間的歐幾里得距離,並將距離按照升序排序,比較升序排序中第一和第二的比值如果小於某個閾值,則認為是匹配點。
由於 中有六個未知參數,隨機選擇3對不共線的點匹配 ,使用該矩陣 計算剩餘 對匹配點的誤差。執行大量迭代,直到內點對最多。可以使用最小二乘估計器估計所有六個參數。
B. 變形和插值
扭曲變形過程中,可能使像素點位置出現負值或者沒有數值與之對應,在這種搶礦下需要插值演算法創建更平滑和准確的數值,進一步減少翹曲中產生的變形。最常用的插值方法是最近鄰插值、雙線性插值和雙三次插值。考慮到精度和計算復雜度之間的權衡,實驗採用雙線性插值演算法。
C. 混合
為了實現並行計算,本文採用了基於羽化的混合方法,其混合函數可以表示為:
其中 是像素 的權重函數。
A. 並行匹配
匹配分為粗匹配和精匹配。粗匹配過程中,塊線程數由特徵元素數決定,每個塊可以實現一個關鍵點之間的匹配,每個線程計算兩個圖像兩個特徵向量的距離。在計算完所有距離後,使用並行計算的歸並排序對距離值排序。最後,所有塊得到的匹配結果存儲在全局內存中,然後傳送到CPU。
精匹配過程,設計內核執行RANSAC迭代,只啟動一個block,線程數為 ,首先用CPU將三個非共線點計算得到的變換矩陣 ,然後將 、閾值和剩餘 個點傳到GPU,判斷內外點。
通過內存分配,可以實現精細匹配優化。
B. 平行變形和插值
將 矩陣的逆矩陣 存放在常量內存中,由於需要頻繁地調用。將待校正的圖像存放在紋理內存中,紋理內存是專門為本地訪問模式設計的。
為了進一步提升性能,若兩個坐標小數部分小於0.2則強度值分配為整數部分,否則使用雙線性插值。
C. 並行混合
由於混合數是像素和像素的混合,因此線程數等於重疊部分包含的像素。令重疊圖像的列數設置為16的倍數。 gridDim.x的大小等於重疊圖像的行數,gridDim.y的大小等於重疊圖像的列數重疊圖像除以16。
基於 CPU 的演算法在配備 16GMB DDR3 RAM 的 Intel Core i7-4790、3.60GHz 處理器上實現。基於 GPU 的演算法在 NVIDIA GeForce GTX745 集成顯卡上進行測試,每塊最大 1024 個線程和 4096 MB 全局內存。
可以清楚地看到,這兩種圖像之間幾乎沒有差異。原因是實驗中使用的GPU卡支持浮點計算,與CPU版本相比產生的誤差非常小。
在本文中,我們提出了一種使用 CUDA 架構在 GPU 上運行的並行圖像拼接方法。順序演算法通過幾個 CUDA 內核轉換為並行版本。通過使用不同類型的內存,我們實現了並行演算法的優化。同時,將GPU獲得的結果與CPU獲得的結果進行比較,我們實現了高達27.6的加速比。盡管所提出的方法顯著提高了計算性能,但仍有許多工作要做。例如,更精確的插值方法(雙三次插值)和可變權重 c( x, y) 可以考慮進一步改善鑲嵌結果。此外,並行鑲嵌演算法也可以在多個GPU平台上運行,對於大數據可以更有效地執行演算法。在今後的工作中,我們將一一處理這些問題。
❻ 圖像雙三次插值演算法原理及python實現
一. 圖像雙三次插值演算法原理:
假設源圖像 A 大小為 m*n ,縮放後的目標圖像 B 的大小為 M*N 。那麼根據比例我們可以得到 B(X,Y) 在 A 上的對應坐標為 A(x,y) = A( X*(m/M), Y*(n/N) ) 。在雙線性插值法中,我們選取 A(x,y) 的最近四個點。而在雙立方插值法中,我們選取的是最近的16個像素點作為計算目標圖像 B(X,Y) 處像素值的參數。如圖所示:
如圖所示 P 點就是目標圖像 B 在 (X,Y) 處對應於源圖像中的位置,P 的坐標位置會出現小數部分,所以我們假設 P 的坐標為 P(x+u,y+v),其中 x,y 分別表示整數部分,u,v 分別表示小數部分。那麼我們就可以得到如圖所示的最近 16 個像素的位置,在這里用 a(i,j)(i,j=0,1,2,3) 來表示。
雙立方插值的目的就是通過找到一種關系,或者說系數,可以把這 16 個像素對於 P 處像素值的影響因子找出來,從而根據這個影響因子來獲得目標圖像對應點的像素值,達到圖像縮放的目的。
BiCubic基函數形式如下:
二. python實現雙三次插值演算法
from PIL import Image
import numpy as np
import math
# 產生16個像素點不同的權重
def BiBubic(x):
x=abs(x)
if x<=1:
return 1-2*(x**2)+(x**3)
elif x<2:
return 4-8*x+5*(x**2)-(x**3)
else:
return 0
# 雙三次插值演算法
# dstH為目標圖像的高,dstW為目標圖像的寬
def BiCubic_interpolation(img,dstH,dstW):
scrH,scrW,_=img.shape
#img=np.pad(img,((1,3),(1,3),(0,0)),'constant')
retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)
for i in range(dstH):
for j in range(dstW):
scrx=i*(scrH/dstH)
scry=j*(scrW/dstW)
x=math.floor(scrx)
y=math.floor(scry)
u=scrx-x
v=scry-y
tmp=0
for ii in range(-1,2):
for jj in range(-1,2):
if x+ii<0 or y+jj<0 or x+ii>=scrH or y+jj>=scrW:
continue
tmp+=img[x+ii,y+jj]*BiBubic(ii-u)*BiBubic(jj-v)
retimg[i,j]=np.clip(tmp,0,255)
return retimg
im_path='../paojie.jpg'
image=np.array(Image.open(im_path))
image2=BiCubic_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image2=Image.fromarray(image2.astype('uint8')).convert('RGB')
image2.save('BiCubic_interpolation.jpg')
三. 實驗結果:
四. 參考內容:
https://www.cnblogs.com/wojianxin/p/12516762.html
https://blog.csdn.net/Ibelievesunshine/article/details/104942406