MATLAB 圖像放大/縮小,雙線性插值


半年前寫過matlab最鄰近插值的圖像縮放,沒怎么考慮邊界問題。更早之前用Opencv寫過雙線性插值圖像放大,不過寫的比較混亂。所以這里用matlab重新再清楚的寫一遍。

 1 close all;  2 clear all;  3 clc;  4 
 5 m=1.8;              %放大或縮小的高度  6 n=2.3;              %放大或縮小的寬度  7 img=imread('lena.jpg');  8 imshow(img);  9 [h w]=size(img); 10 imgn=zeros(h*m,w*n); 11 rot=[m 0 0;0 n 0;0 0 1];                                   %變換矩陣for i=1:h*m 12     for j=1:w*n 13         pix=[i j 1]/rot; 14         
15         float_Y=pix(1)-floor(pix(1)); 16         float_X=pix(2)-floor(pix(2)); 17        
18         if pix(1) < 1        %邊界處理 19             pix(1) = 1; 20  end 21         
22         if pix(1) > h 23             pix(1) = h; 24  end 25         
26         if pix(2) < 1
27             pix(2) =1; 28  end 29         
30         if pix(2) > w 31             pix(2) =w; 32  end 33         
34         pix_up_left=[floor(pix(1)) floor(pix(2))];    %四個相鄰的點 35         pix_up_right=[floor(pix(1)) ceil(pix(2))]; 36         pix_down_left=[ceil(pix(1)) floor(pix(2))]; 37         pix_down_right=[ceil(pix(1)) ceil(pix(2))]; 38     
39         value_up_left=(1-float_X)*(1-float_Y);      %計算臨近四個點的權重 40         value_up_right=float_X*(1-float_Y); 41         value_down_left=(1-float_X)*float_Y; 42         value_down_right=float_X*float_Y; 43                                     %按權重進行雙線性插值 44         imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ... 45                   value_up_right*img(pix_up_right(1),pix_up_right(2))+ ... 46                   value_down_left*img(pix_down_left(1),pix_down_left(2))+ ... 47                   value_down_right*img(pix_down_right(1),pix_down_right(2)); 48  end 49 end 50 
51 figure,imshow(uint8(imgn))

原圖

 放大后的。


免責聲明!

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



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