MATLAB 幾何運算之圖像的放大

一、最近鄰插值算法

思想&步驟:

1.根據放大的倍數,新建一個大小爲原圖像大小*倍數的0矩陣
2.0矩陣的每一個像素點的值根據原圖像求出,即分別把x,y除以倍數後得到的小數取整( matlab中的round函數取小數的最近整數 )
3.對於邊緣的情況要注意


最鄰近插值簡單且直觀,速度也最快,但得到的圖像質量不高。

代碼demo:

A=imread('E:\matlab\work\tiger.jpg');%讀取圖像信息 imshow(A);%顯示原圖 title('原圖'); Row=size(A,1); Col=size(A,2);%圖像行數和列數 nn=2;%放大倍數 m=round(nn*Row);%求出變換後的座標的最大值 n=round(nn*Col); B=zeros(m,n,3);%定義變換後的圖像 for i=1:m   for j=1:n      x=round(i/nn);      y=round(j/nn);%最小臨近法對圖像進行插值      %處理邊緣      if x==0 x=1;end      if y==0 y=1;end      if x>Row x=Row;end      if y>Col y=Col;end      B(i,j,:)=A(x,y,:);    end end B=uint8(B);%將矩陣轉換成8位無符號整數  figure; imshow(B); title('最鄰近插值法放大'); 

效果:





二、雙線性插值算法

思想&步驟:




雙線性內插值法計算量大,但縮放後圖像質量高,不會出現像素值不連續的的情況。


代碼demo:

I=imread('E:\matlab\work\tiger.jpg'); figure,imshow(I); title('origin image'); [rows cols tongdao]=size(I); I=double(I); k=2; x_new=rows*k; y_new=cols*k;%縮放至k倍  I_new=zeros(x_new,y_new,tongdao); for rgb=1:tongdao    for i=1:x_new      for j=1:y_new         x=i/k;a=floor(x);         y=j/k;b=floor(y);%雙線性插值算法         if a>0&&b>0&&a<rows&&b<cols               cxb=I(a+1,b,rgb)*(x-a)+I(a,b,rgb)*(1+a-x);               cxb1=I(a+1,b+1,rgb)*(x-a)+I(a,b+1,rgb)*(1+a-x);               I_new(i,j,rgb)=round(cxb1*(y-b)+cxb*(1+b-y));         end       end    end end figure,imshow(uint8(I_new)); title('result image');


效果:






ps:

在MATLAB中,可用其自帶的函數imresize( )來實現雙線性內插值算法。 

雙線性內插值算法的MATLAB源代碼爲: 
A=imread('...');
C=imresize(A,8,'bilinear'); %8爲放大的倍數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章