顯示具有 97360916 王友立 標籤的文章。 顯示所有文章
顯示具有 97360916 王友立 標籤的文章。 顯示所有文章

2011年1月8日 星期六

HW3


今天上課時,老師跟幾位同學很熱烈的在研究討論3D圖片的程式碼,所以理所當然的我就在旁邊偷偷的聽,在快接近下課時間的時候,經過多次的嘗試,老師與同學們終於成功找出比較好的程式寫法,所以我就理所當然的偷偷學了起來,因為上課時間所剩不多,所以我回到家後才開始著手進行這次作業,課堂上最後得到的結論是,一邊取單色,另一邊取剩下的雙色,這是老師從Google上得到的靈感,既簡單,效果也很好。
 
了解了該怎麼作之後,寫程式碼並沒有花太多的時間,結果我花最多時間的地方,反而是如何找到左右眼的圖片,結果網路上找了半天,找不到合適的圖片,只好自己照了照片,意料之中,自己拍的圖片偏差實在滿大的,試了好幾次都不能對的很準,只好挑比較好的兩張來做合成了。
 
雖然不知道效果好不好,不過能夠稍微接觸到現今正在快速發展的3D技術的一部份,就讓我覺得這次的作業很有意義,因為我認為不久的將來,電子產品3D化的速度會非常快速,各式各樣不同的3D產品及技術會一直出現,所以我相信這次的作業雖然簡單,但是一定會對我有所幫助。

2011年1月7日 星期五

HW4


首先是Smoothing與Sharping,第一張為原圖,第二張為Smoothing,雖然貼在blog上的圖片小,看起來不太明顯,不過應該還是看的出來陰影的地方確實有變的比較模糊,第三張圖為Sharping,這張圖就可以很明顯看的出來其差異性。
 
Smoothing的原理其實相當簡單,就只是單純的把目標點及周圍八格的值取出來相加再平均,所以程式碼寫出來也不需要寫的多複雜,就是單純的取出點然後相加,而作灰階跟彩色的差異,也僅止於灰階只要取一次,而彩色需要三種顏色分別各取一次,總共取三次,如此的差別而已。
 
而Sharping的原理稍微比Smoothing複雜一些,課本上寫說可以取周圍四點乘以負一及中心點乘以四相加,或是取周圍八點乘以負一及中心點乘以八相加,藉此達到Sharping的目的,這次作業我選擇使用取八點的方法,因為這種取法可以直接拿Smoothing完成的程式碼直接修改,而且取九個點排版比較整齊,檢查錯誤也比較容易。 
接著是MediumFiltering,也就是所謂的去除胡椒鹽雜訊,第一張圖是原圖,第二張是進行一次去除,第三張是我將第二張圖存檔再去除雜訊一次,很明顯可以看出,第一次就已經將大部分的雜訊除去,而第二次做完,幾乎已經沒有雜訊了,MediumFiltering的原理與前面兩個有些類似,一樣是要取出該點及周圍八點的值,與前兩者最大的差別在於,MediumFiltering取出值之後要進行排序,再從排序完的值中,取出中間值放回該點,來達到除去雜訊的目的。
 
這次的作業跟前幾次比起來算是相對簡單的,老師上課講解完Smoothing的概念沒多久,我就把Smoothing的部分寫好了,其他兩種也沒有特別需要花時間思考,或容易卡住的地方,想法都很直觀,比較多問題的地方可能就是在取出九個值時,會少寫個+1或+2或是*忘記寫,有一兩個同學出的問題就是在那上面,只要排個版對齊就很好解決,沒有什麼大問題。

HW2

第二次作業,內容是進行HistogramEqualization,上面的圖,第一張為原圖,第二張為HistogramEqualization後的圖,可以看出圖片明顯的變亮,雖然看起來有點像海報放太久才會出現的顏色,左下的圖是HistogramChannel,後面看起來好像只有紅色,其實是有綠色跟藍色的,只是紅色比較高,把其他兩種色都蓋過去了。

這次的程式部份,需要計算的部份比較多了一些,不過老師上課講解的很清楚,所以在程式寫作上沒有遇到太大的問題,不過也不表示這次作業一帆風順,有些時候,一些不常注意到的小地方,往往是問題所在之處。

作業剛寫出來時,原本興高采烈的要進行第一次測試,沒想到出來的結果完全出乎我的意料之外,跑出了如下圖這樣詭異的圖片。
雖然隱約可以看到原圖的雛形,顏色卻完全跑掉,頓時心情跌到了谷底,於是我開始檢查我的程式碼,上上下下確認了好幾遍,也跟同學所寫的程式碼及老師的範例進行過比對,計算的部份並沒有問題,不斷的進行修改與測試,問題一直沒有改善,我開始有點慌了。
 
但是問題一定存在於某個地方,所以我決定先把程式暫時完全寫的跟老師一樣,連變數的名稱都寫的一樣,終於,跑出來的圖片結果正確了,但當時我還是不能理解錯誤發生在哪邊。
 
隔了兩三天,我突然想通了,老師的範例中,計算HistogramEqualization的地方,有使用一個iPixelNumber來存放圖片的imageHeight * imageWidth
這一整行是這樣寫:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / iPixelNumber) + 0.5);
 
而我寫的時候,我不想多用一個變數來存放imageHeight * imageWidth,所以我的這一行寫的是:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / iImageHeight * iImageWidth) + 0.5);
 
所有的問題就出現在這一行,當初我寫的時候覺得這樣寫很順,沒有問題,所以忽略了一個小地方,而這個小錯誤造成了整個圖片結果的錯誤,問題在於--我少加了括號,只是這樣而已。
 
正確的寫法應該是:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / (iImageHeight * iImageWidth)) + 0.5);
 
而因為我少加一個括號,所以運算時變成會先除以高度再乘上寬度,這樣算出來的結果當然會相差很多,想通了問題,當然讓人很開心,也給了我一次反省的機會,下次在檢查程式錯誤的時候,絕對不能放過任何一個小地方,就算自己覺得沒有問題,也要進行確認。

2010年11月5日 星期五

HW1

圖片:
原始圖片


   256色      128色 
  

    64色       32色


    16色        8色 
  

    4色         2色

心得:

  這次是影像處理課程的第一次作業,作業內容是將一張彩色的圖片轉換成灰階256色、128色、64色、32色、16色、8色、4色及2色,由於老師所給的範例中,已經有包含灰階256色的實作,因此實際上只要完成後敘七種灰階即可。

  所以這次作業實際上的內容,可以分成了解灰階256色運作的方式,及加以轉換成其他灰階這兩個步驟。

  首先,我第一步做的事情是,先去觀察老師範例所給的程式碼,先去了解哪些部分是填色,哪些部分是實際設值,只要能夠理解整段的意義,後面進行修改其實是很容易的一件事情。

  經過自己琢磨、與同學討論及詢問老師修正錯誤之後,我決定從填色的地方下手,因為我認為這部份是比較好處理的。

  於是我開始思考該如何將填色的區域進行分組,以達到減色的功用,最直觀的想法是直接使用if指令,這樣可以快速達到分組的效果,但是實際做起來會有一個非常明顯的缺點,就是程式碼看起來會很長,分成2色或4色時或許還沒有什麼感覺,但當製作128色時,這個缺點馬上就暴露出來了。

  所以我開始思考使用for迴圈的可能,經過幾次的嘗試之後,終於完成了使用for迴圈來進行填色的程式碼,想法並不複雜,只是單純的將if的判斷式用for迴圈的方式表現出來,於是這次作業的雛形大致上就完成了,經過幾次圖片的測試,確定沒有嚴重的bug或error,就開始進行圖片的擷取和思考心得該怎麼編寫,這次的作業大致上就算是完成了。