Powered By Blogger

關於我自己

我的相片
網站經營斷斷續續,現在以分享程式練習為主。 因為工作需要,不時會有練習程式的需要。 所以將自己練習的過程分享給大家。 如果有幫助到各位,那就太好了! 如果針對本人或網站內容有任何問題, 歡迎與我聯絡。

2012年11月2日 星期五

【Matlab 語言】簡單的影像處理應用

居裡貓最近有個作業,是 Matlab 影像處理部份的簡單應用,雖然也是 Google 了很久的指令教學, 所以寫得也是有點辛苦,然後就來分享一下啦!有需要的人可以自行取用、參考。
作業大致上要完成的就是以下這些功能:
1. Negative 負片效果
2. Flipping vertically  垂直翻轉
3. Flipping horizontally  水平翻轉
4. Switching top left and bottom right  垂直水平翻轉
5. Darkening  色調加深
6. Lightening  色調加亮
7. Scrolling vertically  垂直滾動
8. Scrolling horizontally  水平滾動
9. Zooming in   放大
10.Zomming out  縮小
11.Blurring  模糊

實驗的圖片就拿最近還蠻喜歡的日本藝人「板野友美」來當作實驗圖片囉!

以下圖片順序就如同上述欲完成的效果排序,當然是要讓大家先看看原本的友美囉!
再將原本的友美灰階化~
彩色原圖
灰階後圖片
負片效果
垂直翻轉
水平翻轉
垂直水平翻轉
色調加深
色調加亮
垂直滾動
水平滾動
放大
縮小
模糊(平均模糊)

看完圖片之後,分享時間就到啦!
雖然編寫的相當簡短,因為居裡貓還是 Matlab 初學者,就請大家多多見諒啦!

程式碼:

oim = imread('26VS32ZD66.jpg'); %讀入圖片
gim = rgb2gray(oim); %RGB圖片轉成Gray
%figure, imshow(gim);
imwrite(gim,'gray.jpg');
%------------------------------------------------------
%Negative
nim = imcomplement(gim); %將灰階圖片做負片化
%figure, imshow(nim);
imwrite(nim,'negative.jpg');
%------------------------------------------------------
%Flipping vertically
%fvim = gim(end:-1:1, :,:); %將灰階圖片垂直翻轉
fvim = flipud(gim); %將灰階圖片垂直翻轉,沿水平軸
%figure, imshow(fvim);
imwrite(fvim,'flipping vertically.jpg');
%------------------------------------------------------
%Flipping horizontally
fhim = fliplr(gim); %將灰階圖片水平翻轉,沿垂軸
%figure, imshow(fhim);
imwrite(fhim, 'flipping horizontally.jpg');
%------------------------------------------------------
%Switching
sim = fliplr(fvim); %將垂直翻轉的圖片在做水平翻轉
%figure, imshow(sim);
imwrite(sim,'switchin.jpg');
%------------------------------------------------------
%Darkening
%figure, imshow(gim);
%brighten(-0.8); %亮度變深,目前指令沒有改變對上一個圖像加深

dim = imadjust(gim,[ ],[ ],2);%亮度變深
%figure, imshow(dim);
imwrite(dim,'darkening.jpg');
%------------------------------------------------------
%Lightening
%figure,imshow(gim);
%brighten(0.8); %亮度變亮,目前指令沒有改變對上一個圖像加亮

dim = imadjust(gim,[ ],[ ],0.8);%亮度變深
%figure, imshow(dim);
imwrite(dim,'lightening.jpg');
%------------------------------------------------------
%Scroll vertically
svim = circshift(gim,[-300,0]); %垂直滾動,[a,b]a 決定垂直滾動負值像上正值向下
%figure, imshow(svim);
imwrite(svim,'scroll vertically.jpg');
%------------------------------------------------------
%Scroll horizontally
shim = circshift(gim,[0,-300]); %水平滾動,[a,b]b 決定水平滾動負值像左正值向右
%figure, imshow(shim);
imwrite(shim,'scroll horizontally.jpg');
%------------------------------------------------------
%Zooming in
[X Y] = size(gim); %把灰階突的大小存到矩陣
ziim = imresize(gim,2); %把灰階圖放大
%figure, imshow(ziim);
imwrite(ziim,'zooming in.jpg');
zim = imcrop(ziim,[500 500 X Y]); %裁切放大後的灰階圖從(500,500)的位置開始,裁下原灰階圖的大小
%figure, imshow(zim);
imwrite(zim,'zooming in end.jpg');
%------------------------------------------------------
%Zooming out
zoim = imresize(gim,[50 50]); %縮小到50*50的大小
%figure, imshow(zoim);
imwrite(zoim,'zooming out.jpg');
%------------------------------------------------------
%Bluring
b = fspecial('average',[20 20]); %制定一個20*20的平均濾波
bim = imfilter(gim,b); %將平均濾波加入到灰階圖中,使圖變模糊
%figure, imshow(bim);
imwrite(bim,'blurring.jpg');

以上程式碼如果有不太懂如何使用,就請自行到 Matlab 中去 help 吧!
裡面去搜尋一下函式的解釋囉!

2 則留言:

  1. 你好:我在[X Y] = size(gim);這邊有個問題
    他出現??? Indexing cannot yield multiple results.
    我用你的rgb2gray把圖片轉成灰階影像之後他的直是<720x1280 unit8>
    請問跟這個有關係嗎

    回覆刪除
    回覆
    1. 讀者 Yu-Xiang Wang 你好:
      根據你的這個問題我自己在Matlab 7.8.0(R2009a)版本上執行並沒有出現。
      我依然是使用公佈在上面的程式碼去執行的。

      針對這個問題做解釋,這個問題是你的程式碼裡面出現了變數、函數名稱相同的情形。
      你可以先檢查你的程式碼有沒有變數名稱也是使用 size ,如果有的話改正一下變數名稱。
      要記得 clear 掉變數。
      另外呢,[X Y] = size(gim); 是要取得 gim 的大小,正常情況來說 X 會等於720,Y 會等於 1280。
      unit8 的部份應該不影響程式執行。

      目前可以替你解答大概就是這些,你可以在檢查看看!
      抱歉過了這麼久才看到你的提問!
      如果還有問題可以再來詢問~

      刪除