while 1 disp('注意︰請正當關閉選單否則會出現錯誤'); k = menu('Image processing', '開啟檔案','影像資訊','剪裁','放大影像','縮小影像','旋轉','變亮','變暗','曝光','膨脹','侵蝕','降低解析度','灰階影像','索引影像','平滑濾波器','銳化濾波器','高斯濾波器','平均濾波器','胡椒鹽雜訊','高斯雜訊','斑點雜訊','魚眼影像','扭轉影像','漣漪影像','漣漪影像2','方形切面','存圖','聽音樂','停止播放','離開'); switch k case 1 [filename, pathname] = uigetfile({'*.jpg';'*.tif';'*.png'},'Select an image'); r = imread(filename); figure('Menubar','none'),imshow(r); case 2 figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','imfinfo(filename) 對欲開啟的影像顯示影像資訊|disp("顯示影像的相關資訊") 在指令視窗顯示您所輸入的字串','HorizontalAlignment','left','Max',2,'Min',0); imfinfo(filename) disp('顯示影像的相關資訊') case 3 a=imread(filename); b=imcrop(a); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=imcrop(a);將影像a進行剪裁|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b) 顯示經過處理的影像|disp("選擇您所需要處理的影像") 在指令視窗顯示您所輸入的字串','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(b) disp('選擇您所需要處理的影像') case 4 a=imread(filename); b=imresize(a,1.08); figure('Menubar','none'),imshow(b) title('放大為1.08倍') pause b=imresize(a,1.15); figure('Menubar','none'),imshow(b) title('放大為1.15倍') pause b=imresize(a,1.25); figure('Menubar','none'),imshow(b) title('放大為1.25倍') figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=imresize(a,1.25); 調整影像的放大倍率|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b) 顯示經過處理的影像|title("放大為1.25倍") 影像標題位置輸入顯示的字串','HorizontalAlignment','left','Max',2,'Min',0); case 5 a=imread(filename); b=imresize(a,0.8); figure('Menubar','none'),imshow(b) title('縮小為0.8倍') pause b=imresize(a,0.5); figure('Menubar','none'),imshow(b) title('縮小為0.5倍') pause b=imresize(a,0.3); figure('Menubar','none'),imshow(b) title('縮小為0.3倍') figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=imresize(a,0.3); 調整影像的放大倍率|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b) 顯示經過處理的影像|title("放大為0.3倍") 影像標題位置輸入顯示的字串','HorizontalAlignment','left','Max',2,'Min',0); case 6 a=imread(filename); figure('Menubar','none'),imshow(imrotate(a,30)),title('逆時針旋轉30度') pause figure('Menubar','none'),imshow(imrotate(a,60)),title('逆時針旋轉60度') pause figure('Menubar','none'),imshow(imrotate(a,90)),title('逆時針旋轉90度') pause figure('Menubar','none'),imshow(imrotate(a,120)),title('逆時針旋轉120度') pause figure('Menubar','none'),imshow(imrotate(a,150)),title('逆時針旋轉150度') pause figure('Menubar','none'),imshow(imrotate(a,180)),title('逆時針旋轉180度') pause figure('Menubar','none'),imshow(imrotate(a,270)),title('逆時針旋轉270度') pause figure('Menubar','none'),imshow(imrotate(a,360)),title('逆時針旋轉360度') figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(imrotate(a,360)) 將影像逆時鐘旋轉角度,只要輸入的數字前面加負號就能變順時鐘旋轉|title("逆時針旋轉360度") 影像標題位置輸入顯示的字串','HorizontalAlignment','left','Max',2,'Min',0); case 7 a=imread(filename); b=double(a); figure('Menubar','none'),imshow(b/150) pause figure('Menubar','none'),imshow(b/120) pause figure('Menubar','none'),imshow(b/90) pause figure('Menubar','none'),imshow(b/60) pause figure('Menubar','none'),imshow(b/30) figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=double(a); 使矩陣元素介於0與1之間,0顯示為黑色而1顯示為白色|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b/30) 255除以30使商數介於8與9之間呈現過度洗白,大於1越多曝光度越嚴重','HorizontalAlignment','left','Max',2,'Min',0); case 8 a=imread(filename); b=double(a); figure('Menubar','none'),imshow(b/400) pause figure('Menubar','none'),imshow(b/500) pause figure('Menubar','none'),imshow(b/600) pause figure('Menubar','none'),imshow(b/700) pause figure('Menubar','none'),imshow(b/800) figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=double(a); 使矩陣元素介於0與1之間,0顯示為黑色而1顯示為白色|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b/470) 255除以800使商數介於0與1之間呈現過度洗白,大於1越多曝光度越嚴重','HorizontalAlignment','left','Max',2,'Min',0); case 9 fg=imread(filename); fgd=double(fg); u=double(fg>128); sol=u.*fgd+(1-u).*(255-fgd); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','fg=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數fg|fgd=double(fg); 使矩陣元素介於0與1之間,0顯示為黑色而1顯示為白色|u=double(fg>128); 取影像0到255之間大於128的部份,再轉換成double值|sol=u.*fgd+(1-u).*(255-fgd); 透過求取灰階值小於128的捕數,再將影像陣列相乘即可得到曝光圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(uint8(sol)) 顯示經過處理的影像|曝光是一種攝影效果,使用為微弱光線長時間照射正在顯像的照片|部分影像為正與負,透過求取影像中灰階值小於128的補數,便可產生曝光效果,本圖採用輸出格式為8-bit整數所組成的陣列影像檔','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(uint8(sol)) title('曝光影像1') pause figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','fg=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數fg|fgd=double(fg); 使矩陣元素介於0與1之間,0顯示為黑色而1顯示為白色|u=double(fg>128); 取影像0到255之間大於128的部份,再轉換成double值|sol=u.*fgd+(1-u).*(255-fgd); 透過求取灰階值小於128的捕數,再將影像陣列相乘即可得到曝光圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(mat2gray(sol)) 顯示經過灰階光的強度方式處理影像|本圖採用改變陣列的灰階比例的強烈程度|部分影像為正與負,透過求取影像中灰階值小於128的補數,便可產生曝光效果','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(mat2gray(sol)) title('曝光影像2') case 10 a=imread(filename); b=ones(3,3); c=imdilate(a,b); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=ones(3,3); 建立一個3x3的膨脹影像|c=imdilate(a,b); 對影像進行膨脹處理|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(c) 顯示經過處理的影像|title("膨脹影像") 讓標題顯示文字','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(c) title('膨脹影像') case 11 a=imread(filename); b=ones(3,3); c=imerode(a,b); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=ones(3,3); 建立一個3x3的侵蝕影像|c=imerode(a,b); 對影像進行侵蝕處理|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(c) 顯示經過處理的影像|title("侵蝕影像") 讓標題顯示文字','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(c) title('侵蝕影像') case 12 a=imread(filename); figure('Menubar','none'),imresize(imresize(a,1),1),title('原始影像解析度'); pause figure('Menubar','none'),imresize(imresize(a,1/2),2),title('有效解析度為128 X 128'); pause figure('Menubar','none'),imresize(imresize(a,1/4),4),title('有效解析度為64 X 64'); pause figure('Menubar','none'),imresize(imresize(a,1/8),8),title('有效解析度為32 X 32'); pause figure('Menubar','none'),imresize(imresize(a,1/16),16),title('有效解析度為16 X 16'); pause figure('Menubar','none'),imresize(imresize(a,1/32),32),title('有效解析度為8 X 8'); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imresize(imresize(a,1/32),32) 以重複調整影像縮放降低解析度|title("有效解析度為8 X 8") 讓標題顯示文字','HorizontalAlignment','left','Max',2,'Min',0); disp('假設我們有一個256 X 256的8位元灰階影像為矩陣X,使用imresize(x,1/2);,會將影像大小減半,每隔一行、每隔一列的像素會被去除,') disp('只留下行列數均為偶數的矩陣元素,將上述結果再使用imresize(x,2);變成=>imresize(imresize(x,1/2),2),則所有像素會被複製,產生') disp('與原始影像同樣大小的影像,但每個方向的解析度只有原來的一半變成128 X 128,就可將原始的解析度變小') case 13 a=imread(filename); b=rgb2gray(a); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|b=rgb2gray(a); 將影像由RGB轉成灰階影像|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b) 顯示經過處理的影像|在載入影像之後,使用將RGB影像轉變成灰階影像指令,即可轉成灰階影像|將其載入影像轉換為rgb2gray再經由imshow指令將灰階影像顯示出來','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(b) title('灰階影像') case 14 a=imread(filename); [b,map]=rgb2ind(a,16); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[b,map]=rgb2ind(a,16); 將RGB影像轉成索引,且設定為16色|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(b,map); 顯示經過處理的影像|colorbar 顯示目前配色對應表|在載入影像之後,使用將RGB影像轉變成索引影像指令,即可轉成索引影像|可以自己依其需要調整影像顏色[b,map]=rgb2ind(a,16),此影像定為16色','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(b,map);colorbar title('索引影像') case 15 x=imread(filename); h=ones(5,5)/25 figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','x=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數x|h=ones(5,5)/25 建立5x5的平滑濾波器h|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(imfilter(x,h)) 對影像陣列x以濾波器h進行線性濾波','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(imfilter(x,h)) title('建立5 X 5的平滑濾波使影像平滑化') case 16 x=imread(filename); h1=fspecial('unsharp'); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','x=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數x|h1=fspecial("unsharp"); 使用預設值建立unsharp濾波器|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(imfilter(x,h1)) 以unsharp濾波器來處理影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(imfilter(x,h1)) title('銳化影像') case 17 x=imread(filename); h1=fspecial('gaussian'); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','x=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數x|h1=fspecial("gaussian"); 使用預設值建立gaussian濾波器|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(imfilter(x,h1)) 以gaussian濾波器來處理影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(imfilter(x,h1)) title('用高斯濾波處理影像') case 18 x=imread(filename); h1=fspecial('average'); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','x=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數x|h1=fspecial("average"); 使用預設值建立average濾波器|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(imfilter(x,h1)) 以average濾波器來處理影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(imfilter(x,h1)) title('用平均濾波器處理影像') case 19 a=imread(filename); c=imnoise(a,'salt & pepper',0.1); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|c=imnoise(a,"salt & pepper",0.1); imnoise內含幾種雜訊,這裡採用胡椒鹽雜訊使用10%干擾|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(c) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(c) title('此影像為胡椒鹽雜訊') case 20 a=imread(filename); c=imnoise(a,'gaussian',0.1); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|c=imnoise(a,"gaussian",0.1); imnoise內含幾種雜訊,這裡採用高斯雜訊使用10%干擾|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(c) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(c) title('此影像為高斯雜訊') case 21 a=imread(filename); c=imnoise(a,'speckle',0.1); figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|c=imnoise(a,"speckle",0.1); imnoise內含幾種雜訊,這裡採用高斯雜訊使用10%干擾|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(c) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(c) title('此影像為斑點雜訊') case 22 a=imread(filename); [rows,cols]=size(a); [cx,cy,cz]=size(a); %%cz判斷是否為彩色圖 ox=ceil((rows+1)/2); oy=ceil((cols+1)/2); [y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); r=sqrt(x.^2+y.^2); theta=atan2(y,x); R=max(r(:)); s=r.^2/R; x2=round(s.*cos(theta))+ox; y2=round(s.*sin(theta))+oy; x2(find(x2<1))=1; x2(find(x2>rows))=rows; y2(find(y2<1))=1; y2(find(y2>cols))=cols; f=a(sub2ind([rows cols],x2,y2)); if cz==3 ff(1:cx,1:cy,1)=f(1:cx,1:cy); ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy); ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy); f=ff; end figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[rows,cols]=size(a); 查詢行列大小|[cx,cy,cz]=size(a); 查詢三維陣列大小|ox=ceil((rows+1)/2);|oy=ceil((cols+1)/2); 用此兩行指令找到原點座標|[y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); 使用meshgrid建立兩個二維矩陣,以供三維繪圖所需|r=sqrt(x.^2+y.^2); 對x^2和y^2進行開根號運算|theta=atan2(y,x); 求出極座標|R=max(r(:));|s=r.^2/R;此兩行產生魚眼透鏡效果|x2=round(s.*cos(theta))+ox;|y2=round(s.*sin(theta))+oy;|x2(find(x2<1))=1;|x2(find(x2>rows))=rows;|y2(find(y2<1))=1;|y2(find(y2>cols))=cols; 此六行為了必須修正x2與y2,分別加上ox與oy,後取整數值,要確保讓列索引介於1與rows,行索引介於1與cols之間|f=a(sub2ind([rows cols],x2,y2)) 使用新的索引x2與y2自原始影像矩陣a求得影像|if cz==3|ff(1:cx,1:cy,1)=f(1:cx,1:cy);|ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy);|ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy);|f=ff;|end 來判斷cz為彩色圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(f) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(f) title('魚眼影像') case 23 a=imread(filename); [rows,cols]=size(a); [cx,cy,cz]=size(a); %%cz判斷是否為彩色圖 ox=ceil((rows+1)/2); oy=ceil((cols+1)/2); [y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); r=sqrt(x.^2+y.^2); theta=atan2(y,x); p=theta+(r/100); x2=round(r.*cos(p))+ox; y2=round(r.*sin(p))+oy; x2(find(x2<1))=1; x2(find(x2>rows))=rows; y2(find(y2<1))=1; y2(find(y2>cols))=cols; f=a(sub2ind([rows cols],x2,y2)); if cz==3 ff(1:cx,1:cy,1)=f(1:cx,1:cy); ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy); ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy); f=ff; end figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[rows,cols]=size(a); 查詢行列大小|[cx,cy,cz]=size(a); 查詢三維陣列大小|ox=ceil((rows+1)/2);|oy=ceil((cols+1)/2); 用此兩行指令找到原點座標|[y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); 使用meshgrid建立兩個二維矩陣,以供三維繪圖所需|r=sqrt(x.^2+y.^2); 對x^2和y^2進行開根號運算|theta=atan2(y,x); 求出極座標|p=theta+(r/100);|x2=round(r.*cos(p))+ox;|y2=round(r.*sin(p))+oy; 產生扭轉效果且可以修正K值更改旋轉程度|x2(find(x2<1))=1;|x2(find(x2>rows))=rows;|y2(find(y2<1))=1;|y2(find(y2>cols))=cols; 此六行為了必須修正x2與y2,分別加上ox與oy,後取整數值,要確保讓列索引介於1與rows,行索引介於1與cols之間|f=a(sub2ind([rows cols],x2,y2)); 使用新的索引x2與y2自原始影像矩陣a求得影像|if cz==3|ff(1:cx,1:cy,1)=f(1:cx,1:cy);|ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy);|ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy);|f=ff;|end 來判斷cz為彩色圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(f) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(f) title('扭轉影像') case 24 a=imread(filename); [rows,cols]=size(a); [cx,cy,cz]=size(a); %%cz判斷是否為彩色圖 ox=ceil((rows+1)/2); oy=ceil((cols+1)/2); [y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); r=sqrt(x.^2+y.^2); theta=atan2(y,x); r2=r+mod(r,10); x2=r2.*cos(theta); y2=r2.*sin(theta); xx=round(x2)+ox; yy=round(y2)+oy; xx(find(xx>rows))=rows; xx(find(xx<1))=1; yy(find(yy>cols))=cols; yy(find(yy<1))=1; f=a(sub2ind([rows cols],xx,yy)); if cz==3 ff(1:cx,1:cy,1)=f(1:cx,1:cy); ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy); ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy); f=ff; end figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[rows,cols]=size(a); 查詢行列大小|[cx,cy,cz]=size(a); 查詢三維陣列大小|ox=ceil((rows+1)/2);|oy=ceil((cols+1)/2); 用此兩行指令找到原點座標|[y,x]=meshgrid([1:cols]-oy,[1:rows]-ox); 使用meshgrid建立兩個二維矩陣,以供三維繪圖所需|r=sqrt(x.^2+y.^2); 對x^2和y^2進行開根號運算|theta=atan2(y,x); 求出極座標|r2=r+mod(r,10);|x2=r2.*cos(theta);|y2=r2.*sin(theta); 產生湖面放射狀波紋的漣漪|xx=round(x2)+ox;|yy=round(y2)+oy;|xx(find(xx>rows))=rows;|xx(find(xx<1))=1;|yy(find(yy>cols))=cols;|yy(find(yy<1))=1; 此六行為了必須修正x2與y2,分別加上ox與oy,後取整數值,要確保讓列索引介於1與rows,行索引介於1與cols之間|f=a(sub2ind([rows cols],xx,yy)); 使用新的索引xx與yy自原始影像矩陣a求得影像|if cz==3|ff(1:cx,1:cy,1)=f(1:cx,1:cy);|ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy);|ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy);|f=ff;|end 來判斷cz為彩色圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(f) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(f) title('漣漪影像1') case 25 a=imread(filename); [rows,cols]=size(a); [cx,cy,cz]=size(a); %%cz判斷是否為彩色圖 ox=ceil((rows+1)/2); oy=ceil((cols+1)/2); [y,x]=meshgrid(1:cols,1:rows); r=sqrt(x.^2+y.^2); theta=atan2(y,x); y2=y+mod(y,32); y2(find(y2<1))=1; y2(find(y2>cols))=cols; f=a(sub2ind([rows cols],x,y2)); if cz==3 ff(1:cx,1:cy,1)=f(1:cx,1:cy); ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy); ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy); f=ff; end figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String','a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[rows,cols]=size(a); 查詢行列大小|[cx,cy,cz]=size(a); 查詢三維陣列大小|ox=ceil((rows+1)/2);|oy=ceil((cols+1)/2); 用此兩行指令找到原點座標|[y,x]=meshgrid(1:cols,1:rows); 使用meshgrid建立兩個二維矩陣,以供三維繪圖所需|r=sqrt(x.^2+y.^2); 對x^2和y^2進行開根號運算|theta=atan2(y,x); 求出極座標|y2=y+mod(y,32);|y2(find(y2<1))=1;|y2(find(y2>cols))=cols; 產生毛玻璃式漣漪|f=a(sub2ind([rows cols],x,y2)); 使用新的索引x與y2自原始影像矩陣a求得影像|if cz==3|ff(1:cx,1:cy,1)=f(1:cx,1:cy);|ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy);|ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy);|f=ff;|end 來判斷cz為彩色圖|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(f) 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(f) title('漣漪影像2') case 26 a=imread(filename); [rows,cols]=size(a); [cx,cy,cz]=size(a); %%cz判斷是否為彩色圖 ox=ceil((rows+1)/2); oy=ceil((cols+1)/2); [y,x]=meshgrid(1:cols,1:rows); r=sqrt(x.^2+y.^2); theta=atan2(y,x); k=8; q=10; x2=round(x+k*sign(cos(y/q))); y2=round(y+k*sign(cos(x/q))); x2(find(x2<1))=1; x2(find(x2>rows))=rows; y2(find(y2<1))=1; y2(find(y2>cols))=cols; f=a(sub2ind([rows cols],x2,y2)); if cz==3 ff(1:cx,1:cy,1)=f(1:cx,1:cy); ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy); ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy); f=ff; end figure('Menubar','none'),uicontrol('Style','ListBox','Position',[30 100 500 200],'String',' a=imread(filename); 讀取影像檔案filename,並把讀取結果設定給變數a|[rows,cols]=size(a); 查詢行列大小|[cx,cy,cz]=size(a); 查詢三維陣列大小|ox=ceil((rows+1)/2);|oy=ceil((cols+1)/2); 用此兩行指令找到原點座標|[y,x]=meshgrid(1:cols,1:rows); 使用meshgrid建立兩個二維矩陣,以供三維繪圖所需|r=sqrt(x.^2+y.^2); 對x^2和y^2進行開根號運算|theta=atan2(y,x); 求出極座標|k=8;|q=10;|x2=round(x+k*sign(cos(y/q)));|y2=round(y+k*sign(cos(x/q))); 產生方形切面,k與q的數值會影響方形的大小與擾動的程度|x2(find(x2<1))=1;|x2(find(x2>rows))=rows;|y2(find(y2<1))=1;|y2(find(y2>cols))=cols; 此六行為了必須修正x2與y2,分別加上ox與oy,後取整數值,要確保讓列索引介於1與rows,行索引介於1與cols之間|f=a(sub2ind([rows cols],x2,y2)); 使用新的索引x2與y2自原始影像矩陣a求得影像|if cz==3|ff(1:cx,1:cy,1)=f(1:cx,1:cy);|ff(1:cx,1:cy,2)=f(1:cx,cy+1:cy+cy);|ff(1:cx,1:cy,3)=f(1:cx,cy+cy+1:cy+cy+cy);|f=ff;|end|figure("Menubar","none") 把顯示影像視窗中沒用到的選單圖形設定使它不顯示|imshow(f); 顯示經過處理的影像','HorizontalAlignment','left','Max',2,'Min',0); figure('Menubar','none'),imshow(f); title('方形切面影像') case 27 k=input('請輸入新圖形檔案名稱:','s'); print('-djpeg',k) case 28 load handel; p = audioplayer(y, Fs); play(p); case 29 stop(p); case 30 a=questdlg('Are you sure?','Message','yes','no','no'); if strcmp(a,'yes') return end end end