數(shù)字圖像處理課程設計報告.doc
本科綜合課程設計報告
數(shù)字圖像處理演示系統(tǒng)
題 目 ____________________________
指導教師__________________________
輔導教師__________________________
學生姓名__________________________
學生學號__________________________
052
通信工程
信息科學與技術學院
_______________________________ 院(部)____________________________專業(yè)________________班
___2008___年 _12__月 _30__日
1 主要內容
1.1 數(shù)字圖像處理背景及應用
數(shù)字圖像處理的目的是改善圖像的質量,它以人為對象,以改善人的視覺效果為目的。
目前,圖像處理演示系統(tǒng)應用領域廣泛醫(yī)學、軍事、科研、商業(yè)等領域。因為數(shù)字圖像處理技術易于實現(xiàn)非線性處理,處理程序和處理參數(shù)可變,故是一項通用性強,精度高,處理方法靈活,信息保存、傳送可靠的圖像處理技術。本圖像處理演示系統(tǒng)以數(shù)字圖像處理理論為基礎,對某些常用功能進行界面化設計,便于初級用戶的操作。
1.2 圖像處理演示系統(tǒng)設計要求
能加載和顯示原始圖像,顯示和輸出處理后的圖像;
系統(tǒng)要便于維護和具備可擴展性;
界面友好便于操作;
1.3 圖像處理演示系統(tǒng)設計任務
數(shù)字圖像處理演示系統(tǒng)應該具備圖像的幾何變換(平移、縮放、旋轉、翻轉)、圖像增強(空間域的平滑濾波與銳化濾波)的簡單處理功能。
1.3.1幾何變換
幾何變換又稱為幾何運算,它是圖像處理和圖像分析的重要內容之一。通過幾何運算,可以根據(jù)應用的需要使原圖像產生大小、形狀、和位置等各方面的變化。簡單的說,幾何變換可以改變像素點所在的幾何位置,以及圖像中各物體之間的空間位置關系,這種運算可以被看成是將各物體在圖像內移動,特別是圖像具有一定的規(guī)律性時,一個圖像可以由另外一個圖像通過幾何變換來產生。實際上,一個不受約束的幾何變換,可將輸入圖像的一個點變換到輸出圖像中的任意位置。幾何變換不僅提供了產生某些特殊圖像的可能,甚至還可以使圖像處理程序設計簡單化。從變換性質來分可以分為圖像的位置變換、形狀變換等
1.3.2圖像增強
圖像增強是數(shù)字圖像處理的基本內容之一,其目的是根據(jù)應用需要突出圖像中的某些“有用”的信息,削弱或去除不需要的信息,以達到擴大圖像中不同物體特征之間的差別,使處理后的圖像對于特定應用而言,比原始圖像更合適,或者為圖像的信息提取以及其他圖像分析技術奠定了基礎。一般情況下,經過增強處理后,圖像的視覺效果會發(fā)生改變,這種變化意味著圖像的視覺效果得到了改善,某些特定信息得到了增強。
2 設計思想:
2.1 圖像處理演示系統(tǒng)實現(xiàn)工具的選擇
使用MATLAB軟件進行界面設計及程序編寫。
2.2 選擇MATLAB軟件原因
之所以選擇MATLAB工具是因為:MATLAB是集數(shù)值計算,符號運算及圖形處理等強大功能于一體的科學計算語言。作為強大的科學計算平臺,它幾乎能夠滿足所有的計算需求。MATLAB全稱是Matrix Laboratory(矩陣實驗室),一開始它是一種專門用于矩陣數(shù)值計算的軟件,從這一點上也可以看出,它在矩陣運算上有自己獨特的特點。實際上MATLAB中的絕大多數(shù)的運算都是通過矩陣這一形式進行的。這一特點也就決定 了MATLAB在處理數(shù)字圖像上的獨特優(yōu)勢。理論上講,圖像是一種二維的連續(xù)函數(shù),然而在計算機上對圖像進行數(shù)字處理的時候,首先必須對其在空間和亮度上進行數(shù)字化,這就是圖像的采樣和量化的過程。二維圖像進行均勻采樣,就可以得到一幅離散化成MN樣本的數(shù)字圖像,該數(shù)字圖像是一個整數(shù)陣列,因而用矩陣來描述該數(shù)字圖像是最直觀最簡便的了。而MATLAB的長處就是處理矩陣運算,因此用MATLAB處理數(shù)字圖像非常的方便。
MATLAB支持五種圖像類型,即索引圖像、灰度圖像、二值圖像、RGB圖像和多幀圖像陣列;支持BMP、GIF、HDF、JPEG、PCX、PNG、TIFF、XWD、CUR、ICO等圖像文件格式的讀,寫和顯示。MATLAB對圖像的處理功能主要集中在它的圖像處理工具箱(Image Processing Toolbox)中。圖像處理工具箱是由一系列支持圖像處理操作的函數(shù)組成,可以進行諸如幾何操作、線性濾波和濾波器設計、圖像變換、圖像分析與圖像增強、二值圖像操作以及形態(tài)學處理等圖像處理操作。
2.3 系統(tǒng)結構框圖
圖像處理系統(tǒng)
文件
圖 像
增 強
幾何變換
繪制直方圖
幫助
打開
保存
平滑濾波增強
銳化濾波增強
圖像的平移
圖像的旋轉
圖像的縮放
圖像的翻轉
橫軸翻轉
縱軸翻轉
3 圖形用戶界面設計
GUI是實現(xiàn)人機交互的中介,可以通過它實現(xiàn)數(shù)據(jù)輸入、處理和輸出。MATLAB提供了一個專門的GUI設計工具——圖形用戶界面開發(fā)環(huán)境(GUIDE),使用該工具,可以快速完成GUI設計任務。利用MATLAB提供的有關數(shù)據(jù),還可以創(chuàng)建工具欄控件和多種對話框。
3.1啟動GUIDE
在命令窗口中鍵入guide,啟動GUIDE,顯示如下圖所示的“GUIDE Quick Start” 對話框 。
打開“GUIDE Quick Start”對話框,利用GUIDE 模板創(chuàng)建新的GUI,選擇一個模板后,單機OK 按鈕,在輸出編輯器中打開GUI。如下:
3.2 輸出編輯器
在GUIDE中打開GUI以后,它顯示在輸出編輯器中。輸出編輯器是所有GUIDE工具的控制面板。
可以通過拖拉控件來設計GUI,這些控件位于輸出編輯器左側的工具箱中,有按鈕、彈出式菜單和坐標系等多種。也可以用輸出編輯器設置GUI控件的基本屬性。
3.3 GUIDE模板
“GUIDE Quick Start”對話框提供了幾種基本類型的GUI模板。使用模板的好處是可以通過改模板來快速創(chuàng)建GUI。選擇一種模板以后,它的預覽效果顯示在右面的面板中。
3.4 菜單編輯器
利用菜單編輯器,可以創(chuàng)建、設置、修改下拉式菜單和彈出式菜單。在GUIDE中單機工具欄上的按鈕,或者選擇“Tools”菜單中的“Menu Editor…”選項,打開菜單編輯器的界面,如下圖所示:
上圖中左上角第一個按鈕用于創(chuàng)建下拉式菜單。用戶可以通過單擊它來創(chuàng)建下拉式主菜單。第二個按鈕用于創(chuàng)建下拉式主菜單的子菜單
運行后效果如下:
最終GUI運行效果圖如下:
首次運行后會自動生成zhankeUI.m和zhankeUI.fig兩個文件,默認目錄設在MATLAB安裝目錄下的work文件夾里,zhankeUI.m中存放的是GUI的相關編碼,以及相關控件的回調函數(shù),今后可以對其進行代碼修改,添加,刪除等操作,zhankeUI.fig是GUI的界面文件。今后主要是對zhankeUI.m文件里面代碼的相關操作以實現(xiàn)相關功能!
4 圖像處理演示系統(tǒng)各功能的實現(xiàn)
4.1文件的打開與保存
4.1.1文件的打開
在主菜單“文件”的下拉菜單中,有個“打開”選項,在其回調函數(shù)中添加打開某個文件的相關代碼:
[fname,pname]=uigetfile(*.bmp;*.jpeg;*.gif, Open the file)
fname為將要打開文件的文件名,pname為將要打開文件的路徑。Uigetfile函數(shù)中主要有兩部分參數(shù)*.bmp;*.jpeg;*.gif是想要打開文件的格式,’Open the file’是生成文件選擇打開對話框的標題,此段代碼運行效果如下:
圖 4.1.1 打開一幅圖像
從上圖中選擇需要進行操作的文件,將其打開以便后續(xù)操作…
圖4.1.2 打開一幅圖像后在界面窗口顯示
在‘打開’回調函數(shù)中我希望同時對文件進行相關數(shù)據(jù)的讀取,以便在今后的處理操作中可以方便的調用,讀取完圖像數(shù)據(jù)后在窗口中顯示圖像,相關代碼如下:
V=strcat(pname,fname); %將圖像賦值給變量V
handles.my_data1=V
guidata(hObject,handles) %更新句柄數(shù)據(jù)
axes(handles.axes7) %添加一坐標軸用來指定顯示圖像的區(qū)域
imshow(V) %顯示選取的圖像
當執(zhí)行以上代碼時會有一種情況出現(xiàn)錯誤,那就是當我們進行“打開”文件操作時候,如上圖 Open,在這里當我們沒有選擇文件,而將窗口強行關閉或選擇了程序無法識別的文件格式時,命令窗口會提示錯誤,所以加入如下代碼進行處理:
if fname < 5
return
end
對打開的文件名長度進行判斷,確定有文件打開時會進行下面的操作,當沒有文件時退出,整個回調函數(shù)如下:
[fname,pname]=uigetfile(*.bmp;*.jpeg;*.gif,Open the file)
L=length(fname)
if fname < 5
return
end
V=strcat(pname,fname);
handles.my_data1=V
guidata(hObject,handles)
axes(handles.axes7)
imshow(V)
4.1.2文件的保存
[newfile,newpath]=uiputfile(‘*.bmp’,’Save file name’)
準備把當前文件*.bmp保存到當前目錄下,文件保存對話框中列出當前目錄下的所有文件,保存的文件名和路徑名保存到newfile和newpath中。
4.2 圖像的增強
4.2.1 圖像的平滑濾波處理
1)平滑濾波的作用:
對圖像的高頻分量進行消弱或消除,增強圖像的低頻分量。平滑濾波一般用于消除圖像中的隨即噪聲,從而起到圖像平滑的作用
2)平滑濾波原理:
(1)鄰域平均濾波法
鄰域平均濾波法是將一個像素點及其鄰域中的所有像素點的平均值賦給輸出圖像中相應的像素點,從而達到平滑的目的,又稱均值濾波法。最簡單的鄰域平均濾波法是所有模板系數(shù)都取相同的值.
鄰域平均濾波法的運算公式為:
g(x,y)=1/N ∑ f(i.j) x,y=0,1,2,…,N-1
j=∈M
其中,M是以(x,y)為中心的鄰域像素點的集合,N是該鄰域內像素點的總個數(shù),對每個像素點按該公式進行計算即可得到增強圖像中所有像素點的灰度值。
(2)中值濾波法
盡管鄰域平均濾波法可以起到平滑圖像的作用,但在消除噪聲的同時會使圖像中的一些細節(jié)變得模糊。中值濾波法則在消除噪聲的同時還能保持圖像中的細節(jié)部分,防止圖像的邊緣部分模糊。
與鄰域平均法不同,中值濾波是將鄰域內所有的像素點值按從小到大的順序排列,取中間值作為中心像素點的輸出值。其原理是利用一個奇數(shù)點的移動窗口,將窗口中心點的值用窗口各點的中間值代替,與均值濾波不同,它不是通過對鄰域內的所有像素點求平均值來消除噪聲的,而是讓與周圍像素點灰度值的差比較大的像素點改取近似于周圍像素點灰度值的值。從而達到消除噪聲的目的。
3)實現(xiàn)方法:
采用鄰域平均法對圖像進行處理,實現(xiàn)方法如下:
for i=2:w-1
forj=2:h-1 I_1(i,j)=uint8((double(I(i-1,j-1))+double(I(i-1,j))+double(I(i-1,j+1))+double(I(i,j-1))+double(I(i,j))+double(I(i,j+1))+double(I(i+1,j-1))+double(I(i+1,j))+double(I(i+1,j+1)))/9);
end
end
采用中值濾波法對圖像進行處理,其實現(xiàn)方法如下:
for i=2:w-1
for j=2:h-1
for m=1:3
for n=1:3
hhh((m-1)*3+n)=I(i+m-2,j+n-2);
end
end
for p=1:9
for q=p+1:9
if(hhh(p)>hhh(q))
temp=hhh(p);
hhh(p)=hhh(q);
hhh(q)=temp;
end
end
end
I_2(i,j)=hhh(5);
end
end
圖4.2.1 圖像空域的平滑濾波處理結果
4.2.2圖像的銳化濾波處理
1) 銳化濾波的作用:
圖像的平滑處理會使圖像的邊緣紋理信息受到損失,圖像變得比較模糊。如果需要突出圖像的邊緣紋理信息,則可以通過銳化濾波器實現(xiàn),它可以消除或減弱圖像的低頻分量從而增強圖像中物體的邊緣輪廓信息,使得除邊緣以外的像素點的灰度值趨向于零。
2)銳化濾波原理
銳化濾波器是以對圖像的微分運算或差分運算為基礎。微分運算是求像素點灰度值的變化率,而圖像內不同物體邊緣處的像素點的灰度值往往變化比較明顯,因此微分運算或差分運算可以起到增強邊緣信息的作用。
銳化算子:
0 -1 0
H = -1 4 -1
0 -1 0
3)實現(xiàn)方法:
for i=1:m-2
for j=1:n-2
b(i+1,j+1)=abs(4*x(i+1,j+1)-x(i,j+1)-x(i+1,j)-x(i+1,j+2)-x(i+2,j+1));
end
end
圖4.2.2 模板銳化濾波結果
4.3 圖像的幾何變換
4.3.1 對圖像進行平移
1)圖像平移的作用:
將圖像中的某點從一個位置(X,Y)移動到另外一個位置(X0,Y0),而使平移后的圖像與原始圖像完全相同。
2)圖像平移原理:
圖像的平移是圖像變換中最簡單的變換之一,其特點是平移后的圖像與原圖像完全相同,平移后新圖像上的每一個點都可以在原圖像中找到對應的點。
若點A0(X0,Y0)進行平移后,被移到A(X,Y),其中X方向的平移量為△X.Y方向的平移量為△Y,那么點A(X,Y)的坐標為:
X=X0+△X
Y=Y0+△Y
操作中需要輸入平移的橫縱量,變量的輸入代碼如下
prompt={請輸入橫向平移量};
title=;
ansa=inputdlg(prompt,title);
x1=str2num(ansa{1});
handles.my_data4=x1;
prompt={請輸入縱向平移量};
title=;
ansa=inputdlg(prompt,title);
y1=str2num(ansa{1});
handles.my_data5=y1;
guidata(hObject,handles)
%上段代碼中的x1,y1即為需要輸入的橫向平移量與縱向平移量
執(zhí)行后出現(xiàn)如圖界面:
3)實現(xiàn)方法:
for x=1:w
for y=1:h
PosSourceX=uint16(x+x1);
PosSourceY=uint16(y+y1);
if((PosSourceX<1) || (PosSourceX>w) || (PosSourceY<1) || (PosSourceY>h))
if (xx.BitDepth= =24)
Transfor(x, y,1:3) = uint8(1);
else
Transfor(x, y) = uint8(1);
end
else
if (xx.BitDepth= =24)
Transfor(x,y,1:3) = BmpImage(PosSourceX,PosSourceY,1:3);
else
Transfor(x,y) = BmpImage(PosSourceX,PosSourceY);
end
end
end
end
figure;
imshow(Transfor)
%(PosSourceX和 PosSourceY是平移后坐標點,Transfor為平移后圖片)
圖4.3.1 圖像的平移結果
4.3.2 對圖像進行縮放
1)圖像縮放的作用:
對圖像進行縮小和放大的處理,可分別對其寬和高的縮放量進行設置。
2)圖像縮放原理:
通常情況下,數(shù)字圖像的比例縮放是將給定的圖像在X方向和Y方向按相同比例縮放a倍。從而獲得一副新的圖像,如果X方向和Y方向縮放的比例不同,則圖像的比例縮放會改變原始圖像像素之間的相對位置,產生幾何畸變。設原始圖像中的點A0(X0,Y0)比例縮放后,在新圖像中的對應點為A1(X1,Y1),則坐標關系可表示為:
X1=aX0
Y1=bX0
若比例縮放所產生的圖像中的像素在原圖像中沒有相對應的像素點時,就需要進行灰度值的插值運算,一般有以下兩種插值處理方法。
(1) 直接賦值為和它最相近的像素灰度值,這種方法稱為最鄰近插值法,該方法的主要特點是簡單、計算量很小、但可能會產生馬賽克現(xiàn)象;
(2) 通過其他數(shù)學插值算法來計算相應像素點的灰度值,這類方法處理效果好,但運算量會有所增加
對圖像進行縮放時需要輸入縮放的倍數(shù),其相關代碼如下:
prompt={請輸入X向縮放倍數(shù):};
title=;
ansa=inputdlg(prompt,title);
sx=str2num(ansa{1});
handles.my_data3=sx;
guidata(hObject,handles)
%上段代碼中的sx即為下圖中所輸入的倍數(shù)
同理可設置Y向縮放倍數(shù)sy.
3)實現(xiàn)方法:
m=xx.Width;
n=xx.Height;
m1=m*sx;n1=n*sy;
for h=1:m1;
for w=1:n1;
b(h,w)=i(round(h/sx),round(w/sy));%round 取最鄰近整數(shù)
end
end
(m,n為原始圖像的二維數(shù)據(jù),m1,n1為縮放后的圖像二維數(shù)據(jù),xx為讀取的原始圖像信息)
圖4.3.2 圖像的縮放結果
4.3.3 對圖像進行旋轉
1)圖像旋轉的作用:
對圖像進行任意角度的旋轉。
2)圖像旋轉原理:
圖像的旋轉變換是幾何學中研究的重要內容之一,一般情況下,圖像的旋轉變換是指以圖像的中心為原點,將圖像上的所有像素都旋轉同一個角度的變換。圖像經過旋轉變換之后,圖像的位置發(fā)生了改變,但旋轉后,圖像的大小一般會改變。和平移變換一樣,在圖像旋轉變換中既可以把轉出顯示區(qū)域的圖像截去,又可以擴大顯示區(qū)域的圖像范圍以顯示圖像的全部。
設原始圖像的任意點A0(X0,Y0)經過旋轉β角度以后到新的位置A(X,Y),為表示方便,采用極坐標形式表示,原始點的角度為а。如下圖所示
P
r A(X,Y)
r A0(X0,Y0)
根據(jù)極坐標與二維垂直坐標的關系,原始圖像的點A0(X0,Y0)的X0和Y0坐標如下:
X0=rcosа
Y0=rsinа
旋轉到新位置以后點A(X,Y)的坐標如下:
X=rcos(а-β)=rcosаcosβ+rsinаsinβ=X0cosβ+Y0sinβ
Y=rsin(а-β)=rsinаcosβ-rcosаsinβ=-X0sinβ+Y0cosβ
圖像的旋轉變換用矩陣形式表示如下:
X cosβ sinβ 0 X0
Y = -sinβ cosβ 0 Y0
1 0 0 1 1
對圖像進行旋轉操作時需要輸入旋轉角度,相關實現(xiàn)代碼如下:
prompt={請輸入旋轉角度:};
title=Angle Degrees;
ansa=inputdlg(prompt,title);
n=str2num(ansa{1});
handles.my_data2=n; % n為我們輸入的角度值
guidata(hObject,handles)
V=handles.my_data1;
n=handles.my_data2;
G=imread(V);
i=rgb2gray(G);
pai=3.14;
n=pai*n/180; %將角度轉換為直觀的表示方法,便于直接輸入度數(shù)。
上段代碼執(zhí)行如下:
3)實現(xiàn)方法:
%計算原圖像各像素的新坐標
for indexX=0:(X-1)
for indexY=0:(Y-1)
ImageNew(round(indexX*cos(n)-indexY*sin(n))+round(abs(min([LeftTop(1,1),LeftBottom(1,1),RightTop(1,1),RightBottom(1,1)])))+1,1+round(indexX*sin(n)+indexY*cos(n))+round(abs(min([LeftTop(1,2),LeftBottom(1,2),RightTop(1,2),RightBottom(1,2)]))))=i(indexX+1,indexY+1);
end
end
圖4.3.3 圖像旋轉處理結果
4.3.4對圖像進行橫軸翻轉和縱軸翻轉
1)圖像翻轉的作用:
實現(xiàn)圖像的水平和垂直方向的翻轉。
2)圖像翻轉原理:
垂直方向:y′=h-y+1
水平方向:x′=w-x+1
其中為h圖像高,w為圖像寬
3)實現(xiàn)方法:
if (xx.BitDepth==24)
Transfor(x, y,1:3) = uint8(1);
else
Transfor(x, y) = uint8(1);
end
else
if (xx.BitDepth==24)
Transfor(x,y,1:3) = BmpImage(PosSourceX,PosSourceY,1:3);
else
Transfor(x,y) = BmpImage(PosSourceX,PosSourceY);
end
end
(Transfor為翻轉后圖像,PosSourceX,PosSourceY為翻轉后坐標)
圖4.3.4 圖像的橫軸翻轉和縱軸翻轉
4.4 圖像直方圖的繪制
1) 圖像直方圖繪制的作用:
實現(xiàn)圖像直方圖的均衡化。
2)圖像直方圖均衡原理:
直方圖均衡化是將原圖像的直方圖通過變換函數(shù)修正為均勻的直方圖,然后按均衡直方圖修正原圖像。
圖像均衡化處理后,圖像的直方圖是平直的,即各灰度級具有相同的出現(xiàn)頻數(shù),那么由于灰度級具有均勻的概率分布,圖像看起來就更清晰了。
首先假定連續(xù)灰度級的情況,推導直方圖均衡化變換公式,令r代表灰度級,P ( r ) 為概率密度函數(shù)。 (注:r值已歸一化,最大灰度值為1)。
3)實現(xiàn)方法:
V = handles.my_data1;
xx=imfinfo(V);
Bmpimage=imread(V);
w=xx.Width;
h=xx.Height;
grey_grade=2^xx.BitDepth;
for i=1:grey_grade
grey_friq(i)=0;
end
for y=1:w
for x=1:h
for r=1:grey_grade
if Bmpimage(x,y)==r
grey_friq(r)=grey_friq(r)+1;
end
end
end
end
figure;
subplot(2,2,3);
imshow(Bmpimage);
subplot(2,2,1);
for i=2:grey_grade
line([i,i],[0,grey_friq(i)]);
end
for i=1:grey_grade
sk(i)=0;
p_eq(i)=0;
end
sk(1)=grey_friq(1)/(w*h);
for i=2:grey_grade
sk(i)=sk(i-1)+grey_friq(i)/(w*h);
end
for i=1:h
for j=1:w
transfor(i,j)=uint8(sk(Bmpimage(i,j))*255+0.5);
end
end
for i=1:grey_grade
p_eq(uint8(sk(i)*255+0.5))=p_eq(uint8(sk(i)*255+0.5))+grey_friq(i);
end
subplot(2,2,2);
for i=1:uint8(sk(i)*255+0.5)
line([i,i],[0,p_eq(i)]);
end
subplot(2,2,4);
imshow(transfor);
圖4.4.1 原圖像直方圖及均衡化效果
5 小結
從通常意義上講,數(shù)字圖像處理技術更加普遍、可靠和準確,比起模擬方法,它們也更容易實現(xiàn),專用的硬件被用于數(shù)字圖像處理。今天,硬件解決方案被廣泛的用于視頻處理系統(tǒng),但商業(yè)化的圖像處理任務基本上仍以軟件形式實現(xiàn),運行在通用個人電腦上,掌握進一步的圖像處理技能對今后的學習和工作生活也都有其積極的影響!
通過這個階段的努力本圖像處理演示系統(tǒng)已基本完成了對文件的打開保存,以及對圖像的平移、圖像的旋轉、翻轉、圖像的縮放、圖像的增強等功能的實現(xiàn),由于個人水平和時間的有限,此次課程設計還存在許多想法沒有很好的實現(xiàn),擴展功能上也有一定的局限性,希望能在今后的學習中逐漸彌補和改善!
參考文獻
[1]蘇金明,阮沈勇著.MATLAB實用教程(第二版)[M] . 北京:電子工業(yè)出版社 ,2008 . 2
[2]章毓晉著.圖像處理和分析[M] . 北京:清華大學出版社 , 1999 . 3
[3] [美] Rafael C . Gonzalez . 數(shù)字圖像處理(第二版)[M] . 阮秋琦 阮宇智,譯.北京:電子工業(yè)出版社,2003 . 3.