2008年10月20日 星期一

Cgapter 3

  這次課本第三章,老師在上課的時候有先講解前面的一點內容,還有解釋比較難看懂的Bit Planes部分,所以自己看課本的時候就比較容易了解它在說什麼了。不過3.3和後面3.5之後的,上課還沒有時間講到,那邊有些比較偏向一點數學的解釋,就看得不是很懂了。

  3.1的部分只是大概的在介紹這一章的重點而已,這章主要是在談影像輸出(Image display),第二章的時候就已經有說到一些了,這章會有比較詳細的介紹。

  3.2的標題是影像輸出的基礎(Basics of Image Display)。將圖像顯示在電腦螢幕上面時,會有很多的因素影響輸出的影像,課本上寫了4個:(1) 漫射光(Ambient lighting),這個如果不是老師在上課時有講到,我可能就直接翻譯成"環境的光"了。(2) 螢幕的類型和設定(The monitor type and settings),螢幕類型指的好像是LCD(液晶螢幕)和是CRT(傳統螢幕)的差異。關於這2個差異我有找一下奇摩知識+,連結請點我。(3) 顯示卡(The graphics card),顯示卡的工作主要就是要將畫面顯示在螢幕上,所以螢幕上顯示的圖像跟顯示卡也是有不少關係吧。(4)螢幕解析度(Monitor resolution),我不確定這個翻譯對不對......解析度越高的螢幕,顯示的畫面應該會越清楚吧。

  課本上教我們使用一個在Matlab裡最基本的影像輸出函數-image(),但是因為這個是很基本的函數,所以它的功能並不會很強,如果直接使用這個函數輸出圖片的話,很有可能會有錯誤,課本上就舉了一個灰階圖片的例子。錯誤的示範老師在上課的時候就已經試過了,所以我就想試試看這個程式的功能到底弱到哪裡,我把Windows的內建JPG圖片讀進來,還好顯示的時候畫面是正常的,其實它也沒有我們想像的那麼沒用。測試圖片如下:






  課本上說如果要避免灰階圖片那樣的錯誤,就要再加入一些設定的指令。(1) truesize,這個指令讓圖片顯示正確的長寬比例。(2) axis off,這個指令讓顯示圖片時,旁邊的長度和寬度表不顯示。(3) colormap(),要修正灰階圖片顯示錯誤最重要的指令。查詢colormap()函數裡輸入的值,要用size(unique(c))這個指令來查詢正確的值,c是存圖片的二維陣列。下面這個圖片是加入這些指令後image(c),truesize,axis off,colormap(gray(247)),最後顯示的正確畫面:



  接下來,課文的後面再實驗如果改變colormap()函數裡輸入的值會產生怎麼樣的結果。我就照著課本改,輸入colormap(gray(512)),輸出的圖片就偏暗了。相反的,改成輸入colormap(gray(128)),圖片就變亮了。

  3.3的標題是imshow函數。當照著課本的第一個範例輸入程式碼時,跑出2個圖片,第一個看起來是正常的,但是第2張卻是白色的,就是課本p.44頁上面的2個圖。好像是因為檔案的格式被轉成double,才會造成這個結果。後面再將轉成double的那個變數除以255,顯示圖片又會正常了。除以512顏色會偏暗,除以128顏色會偏亮。

  這邊的課文說明看不太懂,英文本身就是我的罩門,數學也是我的罩門,所以當英文+數學的時候就變成了罩門中的罩門。我不知道為什麼轉成double型態的時後,它的圖片顯示會有改變。我從Matlab的Workspace點進去看2個變數,裡面的值完全都一樣,只差在一個是uint8另一個是double而已。雖然在Matlab裡面試過了課本的這些範例程式,也大概知道輸出的圖片會有什麼樣的不同,但就是想不通這個函數的輸出方式,為什麼會有這樣的差別?

  3.4則是老師在上課時有特別說明的Bit Planes。它的方法就是取出影像中每個點在2進位的第n個位元,只有單純的0或1,然後用來顯示一張只有黑色和白色圖片。如果取的是較高的位元,那麼輸出的影像跟原本正常的影像會比較類似。但是當取的位元未來越低時,影像就會越來越模糊,最後就變得跟電視收不到訊號所顯示的畫面一樣了。

  如果這邊我自己讀的話,大概又跟3.3一樣看不太懂吧,好家在老師在上課時有說過。因為顏色深的點,那個位置的值就會比較大,在2進位裡高位元有"1"的機率比較高,所以取高位元的值作為0和1(白色和黑色)的判斷條件,和原本圖片就會比較像。反之,如果取較低位元的話,因為就算是深色的點,2進位裡低位元有"1"的機率和淺色的點應該是差不多的,所以黑色點和白色點就會很平均的散布在整個畫面裡。

像電視機收不到訊號一樣的圖= =


  3.5則是在說明圖片的解析度(Spatial Resolution),剛看到課本上的圖,覺得還真是像在打馬賽克一樣呢!解析度就是我們一般說的幾成幾,ex:1024x768。這邊用到imresize()這個函數來降低圖片的解析度,imresize(x,1/2)這個指令會讓圖片的解析度降低一半,圖片大小會變成原本的4分之1。它將原本應該有4個點的值,減少為一個點,這樣的話圖像的解析度就變少了,看起來會變得比較小張。當輸入的指令為imresize(imresize(x,1/2),2),它會將圖片的解析度減少,但是圖片的大小還是一樣大,看起來圖片就會變得模糊。課本上輸入的imresize(imresize(x,1/32),32),解析度只剩下8x8,所以p.52頁的圖3.7(d)就會只變成8x8的格子了。

  因為課本上很多範例幾乎都是灰階的圖片,所以我自己就拿Windows的彩色範例圖片來做實驗,看看能不能用一樣的方式降低解析度。下面的圖是我實作的結果,可以很明顯的看出來第2張圖片變的很不清楚,證明了這個指令也是可以用在彩色的圖片上



  3.6 Quantization and Dithering(量化處理和???),翻譯不知道= ="
這篇感覺也比較困難,我只看得懂前面一點點在做甚麼而已,後面把影像弄成一點一點的那個就不清楚是在幹嘛了。前面感覺只是改變灰階的顏色種類,從最白到最黑有很多種深淺變化,改到最後只剩下p.56頁上面圖的2種顏色。

  我覺得第3章明顯比前2的章節還要難很多,有比較多的數學運算、影像處理的方法(演算法?)等等。感覺就比之前還要痛苦,而且還是有蠻多都沒有懂的地方,希望下星期老師能對於第三章比較難的地方再做一些說明。

1 則留言:

  1. 你把你心中的疑問說明的很清楚, 這對於學習有很大的助益。

    我個人覺得英文、數學並不是你的罩門, 而是在過去的學習生涯中, 你遇到問題時, 你並沒有把問題真正弄懂, 就直接學習新的進度, 長久累積, 感覺就是有一座很大的山橫在你的面前, 形成你所謂的罩門。

    為什麼數值大小相同, 儲存的資料型態不同, imshow 這個指令的輸出就會不同呢? 你的問題我們上課會詳加討論。

    回覆刪除