2013年12月25日 星期三

課程心得與回顧

這學期有不少的主題















從最一開始的Level、Histogram
到後面的影像模型
因為都是每次上課慢慢做
每個禮拜慢慢寫
可能感覺沒什麼太大的成果
但不知不覺其實內容也不算少了
老實說上課說的程式我覺得不是最大的收穫
收穫反而是上課的一些其他內容
課堂上分享的一些東西和想法
這些東西都是我覺得比較重要的
不知不覺也到了學期的尾聲
雖然東西之前都做完了
但是寫心得對我來說依舊是一件我不想面對的事
所以一直拖到現在才寫
說道這學期我覺得Curve大概是最難的一個課題
說不定最難的其實是魔術棒
但我現在還沒有寫
過一陣子說不定會補上
只是可能也是寒假的事情了
我也不太確定
說道這學期最遺憾的事情大概是沒聽到jpeg的東西
很多老師都有表示過想教
但到最後沒有一堂課有教到過
只能說這真的算是比較可惜的部分了

課程回顧與心得

  這學期影像處理課程真的過得很充實,也學到了很多東西。
  首先在學期剛開始時教了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眼鏡,我會好好珍惜的。

課程心得與回顧

課程心得與回顧
        這學期的影像處理課程學到了一些比較基本的程式,主要也都符合課程名稱,都是在處理影像,其中學了Histogram、PS Levels、Curve、空間濾波器(銳化、模糊化、中值化)、3D立體影像、色彩模型。

        其中我比較喜歡Histogram,因為程式的部分需要寫的比較多,而且要把程式優化更是需要花時間,把一些額外的功能加進去,然後會發現一些bug,再將bug解決,做出成品的感覺相當棒,不僅自己學到東西,做出來的程式也能供他人輕鬆使用。其他程式都相對少而且都偏向理論,只要知道其概念,程式都不難寫出來,所以反而不怎感興趣。3D立體影像我以前以為是多難的東西,這次接觸到才發現原來沒那麼難,將2張圖片改一改做結合,再利用特殊眼鏡看即能看出其3D效果了。

        課程意見~理論有時很簡單,但卻講解滿久的,所以反而讓上課有點枯燥無聊。

2013 數位影像處理 心得

              從第一堂課開始  介紹影像的基本要素     本學期程式實作所用的IDE到後
面真正開始實作Curve Level,才開始了對影像處理有了真正的程式體會剛開始認為沒有講義,沒有程式範例要實作 真的很困難  加上 或許程式基礎能力
不是很好,所以開始撰寫時 有些許困難 但老師上課其實會給許些程式範例 重點提示  再加上  若是真的卡住了小BUG  也可請求老師支援.或許有些人會覺
得寫程式 在大一程設  大二資料結構時 就有寫過了,何必花時間在選修上.但在
這門課  才能實際體會真正的應用,即使只有在影像處理這方面,但已經脫離原本
簡單程式數學運算,而是能夠像是上市的PS的些許功能,即使功能不是很強大, 能夠實際應用在自己的相片處理 所帶來的成就感  一定是跟基本的程式設計 所不同的.
老實說  對於BCB的應用還不是很熟悉  因為這學期修了多門選修,同時學BCB 
Eclipse     c#   三種IDE  有點頭昏眼花,但對於影像處理的基本觀念 以及一些影像處理功能原理 有了進一步的了解或許IDE  不熟    但只要原理 程式架構 都有所了解  ,將來不管換到哪個環境  都是可以實作的. 尤其專研是跟影像處理有關係  修過這門課  更是省下自己花時間去看書學習影像處理的基本架構



HW06 心得感想

1.  一開始是  講解跟Build C++有關的內容
包含如何使用這個環境做出一些相關元件
以及在這學期內會用到的函式庫等等。

2.  學到了跟RGB相關的內容,從BMP檔內要如何提取像素資料,並Show出其RGB值。

3.  透過第二點的技巧,學會了亮度及色彩飽和度的程式應用,也能依照自己的意思將RGB的顏色係數做修改

4.  透過第二點的技巧,也能夠做出灰階影像。

5.於期中考左右的時間,老師教了關於9宮格(像素位置九宮格)的應用,以此延伸出銳化、柔和等影像處理技巧。

6.也透過簡單的老鼠走迷宮演算法延伸出PhotoShop常用的"魔術棒功能",將相似的顏色像素視為路徑,顏色跳動過大的視為牆壁及死路,並把所有通道選取起來,這就是基礎的魔術棒選取功能的程式設計!

7. 講了YUV色彩相關的內容,這內容我沒什麼感覺,有用但是我用不到。

8.運用了左眼視角及右眼視角的照片,合成出3D影像,雖然我拍照技巧爛的可以,不過合成出來的影片已經有3D影像的雛形。

HW4

這次的作業是3D立體影像攝影與程式實作

實作方法
首先,找好目標拿出手機或相機拍攝,在左眼的位置和右眼的位置各拍一張,再來標記好左眼與右眼的相片,接著開始打程式。

將左眼和右眼的影像輸入進去
左眼程式碼 :
if(OpenPictureDialog1->Execute())
{
Image12->Picture->LoadFromFile(OpenPictureDialog1->FileName);
iImageWidth = Image12->Picture->Width;
iImageHeight = Image12->Picture->Height;
}



右眼程式碼 :
if(OpenPictureDialog1->Execute())
{
Image13->Picture->LoadFromFile(OpenPictureDialog1->FileName);
iImageWidth = Image13->Picture->Width;
iImageHeight = Image13->Picture->Height;
}


分別將左右眼的影像輸入後接著是將兩張影像合併
將左眼影像紅色的色採資訊複製到新影像,右眼影像藍色和綠色的色彩資訊複製到新影像中。

程式碼 :
for(j=0;j<Image12->Picture->Height;j++)
{
bPtrImageRow1 = (Byte *)Image12->Picture->Bitmap->ScanLine[j];
bPtrImageRow2 = (Byte *)Image13->Picture->Bitmap->ScanLine[j];
bPtrImageRow3 = (Byte *)Image14->Picture->Bitmap->ScanLine[j];
for(i=0;i<Image12->Picture->Width;i++)
{
bPtrImageRow3[i*3] = bPtrImageRow1[i*3];
bPtrImageRow3[i*3+1] = bPtrImageRow1[i*3+1];
bPtrImageRow3[i*3+2] = bPtrImageRow2[i*3+2];
}
}

最後將影像存檔下來
 if(SavePictureDialog1->Execute())
{
Image14->Picture->SaveToFile(SavePictureDialog1->FileName);
}


完成的3D影像

這張是原本製作的3D圖,因為效果不是很好,所以重新製作了一張為上面幾張圖

================================================================
心得
做完之後發現我應該要把三個東西放在不同的位置,不應該是在同一個平行上,這樣看出來的結果就不太不顯。
其實一台相機分別拍攝出左眼影像和右眼影像並不難,但在我們做兩張影像合成完時,拿起3D眼鏡看才發現頭暈暈,做出來的結果不是很好,更何況是將一般的影片拍成3D影片,很開心的是我學會如何自己製作3D影像,步驟很簡單只是技術不好而已。

HW05

HW05
色彩模型程式實作

RGB:
利用3種顏色,先固定一顏色的值,圖則呈現另外兩色各個像素合併再加上固定色彩的像素的顏色,下面滾軸則可調動固定的色彩值的像素(0~255)。
以下為各種固定色彩像素的圖片:0,約126,255;左固定紅色,中固定綠色,右固定藍色



2013年12月18日 星期三

HW04

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

2013年12月14日 星期六

HW2

PS Levels
這是原圖!input和output都是RGB色彩的最大和最小值。
至於畫線就很麻煩了,以做標來說,點(0,0)位置是左上角,和以往習慣的(0,0)在左下角不一樣,讓我在適應的時候有點辛苦 。
程式碼:
for (i=0;i<256;i++)
        {
        if ( i <= iInputMin)
            iLevelsTable[i] = iOutputMin;
        else if ( i >= iInputMax )
            iLevelsTable[i] = iOutputMax;
        else
            {
            iInputInterval = iInputMax - iInputMin;
            iOutputInterval = iOutputMax - iOutputMin;
            iLevelsTable[i] =  iOutputMin + (int)((float) iOutputInterval * (i - iInputMin) / iInputInterval + 0.5) ;
            }
        }
        Image6->Canvas->Brush->Color = clWhite;
        Image6->Canvas->FillRect(Rect(0,0,256,256));
        Image6->Canvas->Pen->Color = clBlue;
        Image6->Canvas->MoveTo(0,255-iLevelsTable[0]);
        for (i=1;i<256;i++)
            Image6->Canvas->LineTo(i,255-iLevelsTable[i]);
前面作大於小於的判斷,中間做確認對於每一點的位置(有公式),最後把線畫出來,而且我是設對於值有所改變時就線就會跟著改變,

像這樣式改成input min為50,output max為200,這個意思是色彩值大於200的一律變成255,小於50的疑慮設為0,這樣就會亮的更亮,暗的更暗了
Curve曲線
這個是畫曲線,老實說我還不太了解園裡是甚麼,只知道也是用公式去求出值來。
-------------------------------------------------------------------------------------------------------------------------
Histogram直方圖
 
這是上面的圖把RGB分別數值化,再用線條呈現,可勾選要顯示何種顏色
這是把數值比例調大之後的,能夠明顯看出差距

2013年12月11日 星期三

HW04

這次的作業是如何讓照片呈現3D的狀態
首先是開始
我將讀入圖片分為左眼及右眼的視野
載入左右眼的圖片
讀入圖片後就可以開始3D工作囉~





心得:
其實一開始的時候還滿擔心這次的作業
但是經過同學的指導講解後
便有了豁然開朗的感覺
只要將左右的圖片的色素值分別讀入最後的結果的圖檔就好


for(j=0;j<Image8->Picture->Height;j++)
{
bPtrImageRow1 = (Byte *)Image8->Picture->Bitmap->ScanLine[j];
bPtrImageRow2 = (Byte *)Image9->Picture->Bitmap->ScanLine[j];
bPtrImageRow3 = (Byte *)Image10->Picture->Bitmap->ScanLine[j];
for(i=0;i<Image8->Picture->Width;i++)
{
bPtrImageRow3[i*3] = bPtrImageRow1[i*3];
bPtrImageRow3[i*3+1] = bPtrImageRow1[i*3+1];
bPtrImageRow3[i*3+2] = bPtrImageRow2[i*3+2];
}
}
這段程式碼是關鍵!!
因為要分別讀入原圖的色素植然後取代過去
還滿令我感到特別的
這次的作業又讓我學到了寶貴的一課!!