顯示具有 00361040 陳碩鴻 標籤的文章。 顯示所有文章
顯示具有 00361040 陳碩鴻 標籤的文章。 顯示所有文章

2013年12月26日 星期四

HW05

  這次的作業是寫有關色彩模型的程式,首先是RGB的色彩模型,其作法是先顯示RGB三個顏色中先各別取兩個顏色繪出圖形,並將第三個顏色的數值透過TrackBar來改變,而事實上這三個圖結合在一起是個立方體,其結構就如下圖所示
  其意義就是,三個象限軸個別是RGB,透過RGB三個數值的改變,從最小數值RGB(0,0,0)也就是黑色,一直到最大值RGB(255,255,255)也就是白色,所建構出來的色彩模型。
然後這是將背景panel的顏色改成選到的顏色。
接著這只是原圖
將原圖的RGB透過公式計算出YUV色彩模型的Y值,公式如下
Y = ( 66 * R + 129 * G + 25 * B + 128 ) >> 8 + 16
套用這個公式後即可求出Y值,並將原圖RGB的數值全改成Y值即可做出灰階圖形。
最後是有關YUV的色彩模型,左邊即是YUV的部分色彩模型(Y = 128時,YUV的色彩分布),跟RGB色彩模型一樣,YUV色彩模型也是一個立方體,比較特別的是YUV模型的中心點才是黑白灰的顏色。
  要繪製那個色彩模型比較特別,並不是直接將YUV的數值填入像素點內,而是要先透過公式轉換成RGB後才能填入像素點(因為C++Builder的色彩格式為RGB),轉換公式如下
R  = clip( 298 * ( Y - 16 )                               + 409 * ( V - 128 ) + 128 ) >> 8
G = clip( 298 * ( Y - 16 )  - 100 * ( U - 128 ) + 208 * ( V - 128 ) + 128 ) >> 8
B = clip( 298 * ( Y - 16 ) + 516 * ( U - 128 )                                + 128 ) >> 8
而右邊的圖也是將已知的YUV數值(Y數值為原灰階圖+TrackBar數值=>若範圍設定成-128~128,UV可透過MouseDown事件得到的XY數值決定)套入上示公式求出個像素點的RGB數值。
  這次作業只講了RGB和YUV兩個色彩模型,但其實還有一些其他的色彩模型,例如:CMYK、Lab……等,而這些色彩模型都有其用途,像是RGB用於電子產品的螢幕、攝影機所存取的影像多為YUV格式、CMYK(色料三原色,C為Cyan即青色,M為Magenta即洋紅色,Y為Yellow即黃色,K則是黑色會訂為K是為了避免與Blue的B重複導致混淆)則用於列印影像、而Lab則是最接近人眼所視色彩範圍的色彩模型……等。

2013年12月25日 星期三

課程回顧與心得

  這學期影像處理課程真的過得很充實,也學到了很多東西。
  首先在學期剛開始時教了C++Builder的基本操作,雖然之前有用過C++Builder來寫過程式,但仍沒學過如何利用C++Builder來開啟或儲存圖檔和處理影像,所以一直都認為用C++Builder來處理影像是十分複雜且麻煩的,然而在這門課都一併學到了,而且也沒想像中的那麼難,只要透過OpenPictureDialog和SavePictureDialog元件就可以輕鬆地開檔及讀檔,然後再利用兩個for迴圈就可以簡單的處理影像。接著在這門課還學到了一些PhotoShop裡的一些影像處理的函數,包括影像調整(負片、灰階、均化、銳化、胡椒鹽化、中值化)、影像的色階和曲線調整,還有魔術棒……等程式的實作,這些程式完成後都覺得自己也可以寫出一套PhotoShop了。最後還學到了有關3D製作以及色彩模型相關的東西。
  當然在學習過程中仍有遇到一些問題和比較可惜的事情,例如:第一個遇到的問題是以前看別人或自己用C++Builder來寫影像的程式都是用Image->Canvas->Pixels[i][j]來取到像素點再做讀取或處理,但老師的用法卻是ScanLine來取到一列的起始指標,在剛開始除了不習慣外還因此遇到了許多問題,最後上網找資料後才發現原來有三種選取像素點的方法(第三種方法和第一種差不多,只是寫法上的不同),而且各有利弊(讀取起始指標的方法速度較快,但要取上下像素點相對會較麻煩,而讀取像素點剛好完全相反)、第二遇到的問題是JPG檔無法處理,而原因是他不會建Bitmap,而導致無法處理、最後遇到的問題則是3D圖片不知道要去哪拍或拍什麼。而比較可惜的是影像資訊直方圖沒有把顯示部分資訊的程式碼未寫出來。
  然後對這門課的建議是可以不要頻繁切畫面,雖然有的時候是要講很重要的東西,但頻繁切畫面會使得程式可能正打到一半而忘記要修改什麼(雖然跟我沒關係,因為我自己帶筆電所以不受影響)。
   最後感謝老師所贈送的3D眼鏡,我會好好珍惜的。

2013年12月18日 星期三

HW04

  這次的作業是寫3D影像,做法就是擷取左眼影像的青色部分、和右眼影像紅色部分,再將這兩個部分影像結合成一張新的影像,透過特製眼鏡,就可產生出3D影像。
  首先,下圖左邊的是左眼的影像、右邊的是右眼的影像。
   然後這是合成之後的結果
  最後是對這次3D作業的感言,首先這程式其實真的很簡單(在老師講解完3D演算法的當週,我就已經完成了),但要拍攝好的3D圖片真的很困難,除去思考拍攝素材為和之外,拍攝的方法真的很麻煩和困難,因為要使兩張圖的透視點在同一個點上,像上面的成品我就不是很滿意,因為仔細看可以發現兩張圖的高度不太一樣,但礙於手機機能不佳,又沒有適合平行拍照的器具,因此只好如此。只是這兩張圖如果用程式修改高度後3D度應該會提高,但我想不到要以什麼點或線作為標準來使兩張圖高度能一致,因此只好作罷,感覺真的很可惜。

2013年12月10日 星期二

HW03

  這次的作業是做一些和濾鏡有關的東西,包括有模糊化、銳利化、胡椒鹽化以及將胡椒鹽化稍作還原的中值化。
  首先這是這次的原圖。


  接這這是經過模糊化之後結果,模糊化基本上就是將一個像素點周圍的八個點加上自己後取平均。其意思如下
中間紅框代表目標像素點,全部權重皆為1/9並將其相加後存入目標像素點,如此一來即可達成模糊化,另外有種凸顯其四周個點的方法,就是目標像素點的權重值取1/4,其上、下、左、右四點權重值取1/8,最後左上、右上、左下、右下權重值取1/16,總之就是透過改變權重使其產生不同的效果。


  接著銳利化其實就是透過上面的那個概念,只是將權種值改變而產生的結果,而我的作法是只取上下左右四點,其數據為目標像素點的權重值取5(或-3),其上、下、左、右四點權重值取-1(或1),另外八點的數據是目標像素點的權重值取9(或-7),其上、下、左、右、左上、右上、左下、右下全部都是權重值取1(或-1),當然不同的數據會產生出不同的效果。


  接著是胡椒鹽,胡椒鹽就是,將圖片的隨機像素點改成黑點(胡椒)或白點(鹽),圖中紅框的部分是干擾的百分比(Noise Percent,即胡椒鹽占整張圖的百分比),實作方法就是在掃描像素點的同時random出一個0~100變數,如果變數 <  Noise Percent/2就將點變成白色,如果變數介於Noise Percent/2和Noise Percent之間就將點變成黑色,即可實作出撒上多少百分比的胡椒鹽。


  最後是中值處理,這主要是在解決胡椒鹽化的圖,這裡又跟上面的九宮格又有關係了,其主要要做的就是將那九個點做排序,選出最中間的數值(所以其實排5次就可以了),把九宮格的數值全部取代成中間的數值就結束了,而其雖然沒辦法完全還原原圖(如果將圖放大會發現有些點還是白點或黑點,同時也會產生些許的鋸齒狀),但至少可使該圖片的胡椒鹽效果緩和,只是如果胡椒鹽的雜訊太多,還是會悲劇。


  以上就是這次的作業,而這次作業也更讓我了解修圖軟體的濾鏡究竟是在做什麼事情。

2013年11月13日 星期三

HW02

  這是我這次程式的外觀,裡面有的功能包括讀檔、負片調整功能、影像長條圖資訊以及圖片色階調整功能(包括線性及曲線的)。
  首先這是我這次選的圖。

  一開始選這圖的時候原本想說長條圖資訊不會稀疏的很誇張,但用了之後我發現我錯了(真的不能相信自己的眼睛,請相信實際計算後顯示的結果)。那麼廢話就不多說了,來講解一下影像資訊的長條圖該如何求出,方法就是掃描過圖片全部的點,將RGB三個顏色在各個色階的量給累加出來,需要注意的一點是每個像素點等同於在陣列中的連續三個位置存入RGB三個顏色的數值,但儲存的順序不是RGB而是BGR。簡單說明就是假設i是像素點個數,那麼在每個3*i中存的會是該像素點藍色的數值、3*i+1中存的會是該像素點綠色的數值、3*i+2中存的會是該像素點紅色的數值。另外要掃描過全部的像素點的方法除了用傳統的Canvas->Pixels[x][y]外,還可以用scanline一行一行去讀取的方法(差異在於執行速度,scanline較快)。畫線部分是透過Image->Canvas->Pen->Color改變筆的顏色再利用MoveTo(畫布指標移至畫布某位置)和LineTo(從畫布指標目前位置移至指定位置)兩個指令來完成畫線。


  接著說明一下我寫的程式,左邊的RadioGroup1(忘了更名...)是在選擇要一般長條圖還是累加型;Channel是選擇顏色,製作方法就是透過幾個CheckBox並在程式碼中多加幾行判斷,來選擇顏色。中間的upper和downer是在調整比例,讓數值能透過人工的方式調整至最佳範圍,實作方法就是多設定一個變數,將全部數值統一乘或除這個變數,在改變這個變數就可以達成改變比例。右邊原本是想做滑鼠指到長條圖上某位置就將該點資訊顯示在Memo上,但還沒完成,如過有機會,可能會在後面幾版完成這功能。


  這就是這張圖的累積值方圖,由於點很稀疏,所以蠻平的。


  然後是Level的部分,也就是圖片色階調整功能。首先是線性的,線性的需要4個數值,分別是Input的Max及min與Output的Max及min,主要的動作是將小於InputMin的值改成OutputMin,將大於InputMax的值改成OutputMax,中間則透過這4個數值連出一條直線。其實這個只要能推導出其公式(用兩點求方程式)就很簡單。須注意的是,不要直接對每個像素點做運算,這樣做會很花時間,可以先將這256個數值經轉換後所對應的數值存起來,透過查表就可大幅加快執行效能。

PS.老師在期中考卷有錯誤,第6題第1個for迴圈應該改成
  for(i = 0;i < 256;i++)
       {
       if(i < _______)
            iLevel[i]=iOutputMin;  //題目寫iLevel[i]=0
       if(i > _______)
            iLevel[i]=iOutputMax;  //題目寫iLevel[i]=255
     .......以下略


  最後是曲線部分,曲線需要3個點,分別是(0,0)、(255,255)以及使用者自訂的點(x,y),透過這三個點可決定出一條曲線,比較麻煩也同時是我有遇到的問題是轉換,如果直接用整數形式運算可能會出問題,所以要適時地轉換成浮點數。


  以上就是這次的心得感想及程式demo。

------------------------------------------------------------------------------------------------------------

由於之前選用的圖片不太好
因此更新其他照片的結果

  首先這是範例圖片裡的企鵝圖

  這是他的原長條圖

  這是累積長條圖

2013年9月24日 星期二

HW01

  我要介紹的app軟體是andriod上的photoshop,他的軟體全名是photoshop touch for phone(adobe公司有推出另一款名為photoshop touch的app軟體,他是平板版的,和photoshop touch for phone的功能應該是大同小異)下圖就是這款軟體的圖標,而這款軟體也可以在google play中下載到,但這是款收費型軟體要價NT$150。
  下圖為photoshop的啟始畫面,中間的圖是之前編輯後的圖(注意:此時圖片尚未存入手機當中)。
  下面的三個選項分別為
    同步-將修改好的檔案同步至自己的adobe的雲端硬碟中。
    新增-可從手機中選擇圖檔、從adobe的雲端硬碟中選擇圖檔、拍照並修圖,以及開起空白圖層。
    匯出-將修改好的圖檔儲存至手機,可存成jpeg和png兩種檔案格式。
  下圖為一張透明圖層(photoshop中透明以灰白相間的格子作表示)

  這款app功能相當齊全,上方工具由左而又分別是選取處理工具(複製、剪下選取範圍...等)、調整影像(黑白、明亮、負片...等)、增加函數(素描、模糊等效果),還有圖片編輯(剪裁、變形、加入文字等等),可是這些功能都是破壞性編輯(電腦版的photoshop有所謂的非破壞性編輯1,曾嘗試過先新增圖層再加效果在該圖層上,但結果是沒反應,因此不知道是沒發先非破壞性編輯的方法,還是根本沒辦法);左下有一些基本工具,分別是印章工具、畫筆工具、魔術棒工具2、選取工具;右下角為圖層,圖層可想像成是很多張投影片3,每個圖層可做不同的事,將這些圖層疊在一起可產生出不同的效果。
註:
1.非破壞性編輯-將編輯後結果另外新增至一個圖層,並將這個圖層蓋在原圖上面,這樣就不會破壞到原圖。
2.魔術棒工具-可快速選取相近顏色的區域。
3.投影片-這裡所指的投影片並非powerpoint,而是以前透過透明及黑點結合出影像的投影片。
 
  這款app的功能時在是太多了,而我也沒一一去嘗試,但還是有用這套軟體做出一張成品,感謝大祐充當模特兒,雖然被我改到已看不出是他了(笑),另外由於當事人要求,所以我也不得不在上面加上我的簽名。