2013年12月31日 星期二

HW3

這次要介紹的是空間濾波器
首先依然是我用我同學的原始照片當開場白了

 

這次的作業有幾個內容
首先是介紹的是模糊化
一個9宮格的像素點相加
將其除以9
得到這九張圖的平均值
將這個平均值放到九宮格正中央的那個值
但是會造成圖片的邊緣削減
下面這是成果


接下來是sharpen
下面這個成品是以
-1  -1  -1
-1   9  -1
-1  -1  -1
為比例做出來的
倒是當初沒想到計算出來的值會有超出界線的問題
這倒是讓我蠻有映像的部分



最後一個是中值濾波器
顧名思義
他就是把周圍的值拿來做排序
把中間那個值拿來當作新的像素值
下面就是實作的結果

2013年12月30日 星期一

課程心得與回顧

課程心得與回顧:
                             影像處理這門課雖然大部分都是照片的修改,色彩值,Histogram,Levels,Curve,銳化,模糊化,中值化等等....但也有程式,而且程式是屬於比較基礎方面。剛好我程度比來就是弱項,藉此學到了很多、可能其他同學會覺得太簡單,但我非常喜歡這樣。不會讓我聽得無颯颯。而且老師還有做講義我聽不懂看不懂得時候我都上去看,有更詳細的解釋可以供我這樣的弱者慢慢學習,非常棒。
                            印象最深刻的就是3D照片這個作業,一開始覺得很恐怖,感覺超難。實做好發現最好玩的一個作業。要先拍左右眼照片(非常好玩,完成圖是否完美就取決於你的技術),再把兩張圖匯入用照片用成3D,再用3D眼鏡看就大功告成了。
                           


HW2

這次的作業是Level和Histogram
Histogram的功能是把你所拍攝的照片
裡面所包含的紅綠藍的值給統計出來
這個功能的好處就是你可以知道照片其所包含的色素統計
這樣使用者就可方便的修改圖片中不要的顏色
相當棒!!!!!!!!!!!!!
再來下一個是Level
這個功能也是對要修圖的使用者
想當有幫助 因為這個功能最主要的
就是修改照片的明暗度
我們先看看原圖
再看看修改過的圖
很明顯的照片變暗了許多
相對的如果再將旁邊的數值
在進行更改 照片就會有更多的變化
這個算是修圖軟體中最基本的功能
也是對修圖的使用者 有著極為強大的幫助

我覺得這次的課程內容讓我了解
原來Photo shop的功能沒那麼難寫
雖然我程式沒很強
但如果有去思考 其實沒那麼難


HW02

這次的作業是關於photoshop改圖的顏色的功能Histogram和Levels。



Histogram
圖片三原色的統計值


 Levels原圖,曲線圖
一開始圓圖,旁邊調好的曲線圖


 修改原圖後新產生出的圖
經過明亮度的BUTTOM團片變得比原圖亮了許多


心得:
這次作業都不難,老師上課都有教了,我也把老師的程式拍下來慢慢看,再加上問同學所以做出來了。這一次作業也非常好玩就像簡易版修圖軟體,成功做出來後非常開心。
只不過Histogram很複,雜搞了很久。RGB三原色統計那邊做的很卡,好險同學有幫忙不然我可能做不太出來。
雖然我程度不太好,好險老師著重於講解基礎,讓我了解了有70%的了解,再加上同學的幫忙,讓我也自己實做出來,感覺特別的不一樣。










2013年12月27日 星期五

撒胡椒,去胡椒

這是我之前就一直有問題的作業
當初留在教室寫的時候有出了點問題
那就是我去完胡椒會有"點畫"的效果

原圖

原圖直接去胡椒

當時做出來的時候感覺是很漂亮的效果
可是感覺不太對
之後去問老師也確定這樣做並不對
之後猜是因為直接存到原圖的關係
大概是因為更新後的值影響到更新前的值吧
之後把結果存到別的地方之後還是覺得有點怪怪的
圖會有點模糊掉
看一下別人做出來的結果好像也是有點模糊掉
原圖

直接去胡椒

20%胡椒

20%去胡椒

仔細想想取出現最多次的值本來就有機會拿到不是原本的值
跟原圖有些差距應該是正常的吧




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日 星期三

色塊

經過一番不明bug的糾纏後
我還是把YUV的色塊給弄出來了
先前在WIKI查到的YUV轉RGB結果YUV是用255去算的
只是我那時候沒有把0~255之外的處理好才會變得亂七八糟
處理好後YUV的色塊就好了
再來就是調圖片顏色的部分
這次雖然第一次就有做出東西但是有點缺陷
就是當我多按幾次時整張圖會逐漸變成都是那個顏色
原圖

多按幾次的結果

直覺覺得是因為直接把結果蓋在原圖上才會變成這樣
每次改變圖的RGB之後Y值被影響吧
之後把結果紀錄到別張圖就沒問題了
最後結果
只是我電腦沒有XE2所以用builder6做了
所以介面會不太一樣,也沒有之前的東西

RGB色塊補上
不過不知道為什麼不再額外設定bitmap的寬高就會有超出記憶體的問題
是因為旁邊的設定值寫的寬高不是bitmap的寬高而是image的寬高嗎?







心得

在這堂課上學到不少跟影像有關的新知
我以前只知道RGB三種顏色可以配色之類的
上過課後學到了可以用RGB來調整圖片
影像處理說穿了 就是用圖片上的RGB或YUV來控制圖片的效果
知道處理的方法反而是重點
像3D影像本來以為是很複雜的東西
可是知道處理方法之後才知道其實很簡單
要讓兩隻眼睛分別看到兩眼該看的影像
透過3D眼鏡讓兩眼分別看到過濾過圖片
之前看過一種很大顆的眼鏡是讓兩眼分別看到兩個畫面
應該是一樣的原理吧
除了學到的之外
還有為了交作業跟別人一起晚上留在電腦教室寫程式的經驗
這種感覺其實還滿有趣的
我其實還滿期待下學期的互動視訊
雖然要用什麼樣的遊戲完全沒有頭緒
不過這還是到時候再考慮吧

課程心得與回顧

這學期有不少的主題















從最一開始的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];
}
}
這段程式碼是關鍵!!
因為要分別讀入原圖的色素植然後取代過去
還滿令我感到特別的
這次的作業又讓我學到了寶貴的一課!!