MATLAB--數字圖像處理 圖像的收縮

圖像的收縮

定義
圖像的收縮通俗一點就是我們常說的放大、縮寫,在數字圖像處理中,就是指像素的增加與減少。比如22的圖像,有4個像素,放大兩倍,那麼就有44=16個像素。

那麼怎麼對圖像進行收縮呢?

這裏拿放大舉例:放大二倍的圖像就是圖片的width、height都擴大爲原來的兩倍,也就是像素總數爲原來的四倍。那麼怎麼在保證圖片內容不變的情況下增加像素呢?這個也簡單,舉個例子,比如一個紅色的圓原來是4個像素(4個相同的像素)來表示,二倍後的圓那麼就是用16個像素(也是相同的)來表示,通俗來說,就是用更多的像素來表示同一種圖形。原來需要4個,那麼現在就需要16個。

當然,隨機圖像上面一個片段是由多個不同的像素表示,那麼怎麼增加像素個數,同時圖形還不變化呢?這個就要用插值來計算了。舉個例子,一段上坡路,現在要把它增長(在中間增長),那麼肯定是在中間填入和兩側差不多的高度,使得原來的坡面同樣也是連續的,保持原來的連續性。所以插值的目的是:通過填充像素,保持原圖像的一致,和高數上變化後保持連續性相似。下圖是插值法的說明:
在這裏插入圖片描述
在這裏插入圖片描述
該算法的僞代碼:
在這裏插入圖片描述

我的理解:
比如原圖的大小爲300400,放大兩倍,變成600800;原圖上(1,2)的點在放大圖的點爲(2,4)。這個應該比較好理解。

編程的時候,我們是先構造出放大圖像的空矩陣,再依次填值。這就要求我們要能夠在已知知道放大圖像中的一個點座標,計算出原圖的座標,然後把原圖的座標賦值給新點。

這裏運用比例思想,比如x軸上,放大圖爲2,它佔總長600的2/600,那麼原圖的x座標同樣也佔x軸的2/600,計算出來爲1.
假設(x1,y1)爲放大圖像的值,(x0,y0)爲原圖的值,m,n爲原圖的橫縱長度,rm,rn爲放大圖的橫縱長度。

有以下關係:

x1/rm=x0/m y1/rn=y0/n

可以推導出:

x0=x1m/rm y0=y1n/rn

最後再利用雙線性插值法插值即可。
這裏代碼是(其實就是先分別求出周圍4個點,利用不同的取值函數就行,再計算):

rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;

全部代碼:

 t=imread('a1.jpg');
[m,n,dep]=size(t);
%自定義長 寬 
rm=1400;
rn=822;

%構造新矩陣 存儲收縮後的圖片
rt=zeros(rm,rn,dep);

for i=1:rm
for j=1:rn
%座標轉換
x=i*m/rm;
y=j*n/rn;
%求出偏移量
u=x-floor(x);
v=y-floor(y);
%邊緣處理
if x<1
x=1;
end
if y<1
y=1;
end
%雙線性插值
rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;
end
end


imshow(t);title('原圖');
figure;imshow(uint8(rt));title('加倍後的圖片');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章