顯示具有 95360794 康峻岳 標籤的文章。 顯示所有文章
顯示具有 95360794 康峻岳 標籤的文章。 顯示所有文章

2010年1月11日 星期一

HW8_期末心得與檢討報告

這是我第二次接觸有關於影像方面的課程

必須說的是關於出席率的部分是非常低
不過其實自己也都知道除非特殊情況,不然應該都要避免翹課

在學期初的時候,只是抱持著不要太差的心態
後來漸漸對於這門課其實小有心得(興趣?

雖然會少聽了一些老師授課上的講解,不過在資訊發達的現在要找到資料其實不難

後來在一次的上課有問到一些問題,被老師說是基礎
心裡是比較不好受,但了解到如果有上課直接找老師討論問題,其實這些小問題很快就可以得到解答。
而且一些很雜的、無關緊要的東西有時候在網路上也查不太到,所以有老師講解是最快的

上課的方式跟之前是一樣的,算是自由及規定兼具吧!
對於這種上課方式,覺得算是訓練學生自主學習,也希望能夠有比較多的互動

雖然感覺到或許程式會不會寫在這門課比較不是那麼苛求(因為老師都有講解了
但是我是個不太會寫程式的人,理論的邏輯的東西如何轉成想要的Code一直都是我最頭痛的地方,在上了這門課後讓我覺得對程式更加熟練如何去實做你想要。
在寫作業時,會讓我有熱血的想要去了解他到底是為什麼要這樣寫,怎麼把它給弄好。

學習上的困難應該是
理論如何實做以及相對於我的學習態度

這門課對我來說像是一扇窗吧,打開了我對於程式的求知慾
也體會到課堂的重要性在哪。

HW7_邊緣偵測 Sobel運算

邊緣偵測

首先是梯度跟sobel
梯度的用途是代表某一點的值變化最大
而Sobel就是用來運算圖像的梯度之近似值
Sobel介紹

彩色的邊緣偵測↓










黑白的邊緣偵測↓











這個程式是利用上一次作業遮罩的運算
這次作業跟上次作業都使用到了遮罩
利用一個點周圍的權重來調整影像
不同的是之前是使用一個遮罩來對影像進行銳化或是模糊
而這次的作業是使用兩個遮罩,進而尋找當中像素變化大的地方

也就是將原本的運算必須改為對水平遮罩及垂直遮罩都做一次
Gx↓           Gy↓ 

之後的運算我有試過用sqrt來求出影像…但是邊緣模糊,而且圖似乎會變暗
且周圍會存在一些的雜訊。(試過很多種寫法,忘記哪些寫法會造成什麼結果…)
總之就是感覺不是那麼精準,因為是尋找"邊緣",不精確就失去感覺了
最後是用除的方式來取到要的值。

2010年1月4日 星期一

HW6_空間濾波器

彩色&使用者自行輸入,成果圖↓









先新增老師的程式碼來了解,還沒改成自己得寫法↓

dollar的圖確定是8bits,彩色是24bits


















這次的作業對我來說應該是尚未完全

雖然在老師Blogger中的程式碼我直接拿來修改並增加功能不會出現問題
但是如果我使用自己的寫法,記憶體配置就會出現問題或是scanline超出範圍
一樣是使用指標在進行抓點配置空間…

原理不難…就是選擇一點之後抓附近的八個點進行濾波
增加的功能讓使用者自行輸入調整比重

我都會看大家的問題出現在哪邊所以比較快解決
前幾個交作業中有提到3個Channel的問題,bit數不同的關係

還在想辦法對自己的程式進行修改…|||

-----心得更新-----
關於8bit跟24bit的問題,是我在這門課上遇到最麻煩的吧…!

找尋各種資料來比對我得錯誤。
8bit為每一個pixel用8bit表示,24bit則為三倍…

再來就是因為在8bit也就是256色…需要使用調色盤參考
而24bit則不用使用調色盤…

當我要使用8bit時,Palette必須設為Pixelformat(
pf8bit

單一功能程式執行沒問題…
或許程式功力有差…
由於調色盤的使用讓我的程是很難整個去把它改寫
因為各種功能都整合在一起,如果調色盤轉變之後
讀圖
、畫圖的時候都必須一起改變
因為長度的不同,像素點抓的時候也必須改變
這樣才不會出現一開始心得中提到的問題…

2010年1月3日 星期日

HW5_位元切面(Bit Planes)

(心得修正…發現自己太笨做了多餘的東西)

依照習慣先來個成果圖↓ 為了方便觀看,此版本是特別弄出8bits的切面












這次作業花了不少的時間,但是完成之後會發現原理其實很簡單。
基礎原理:
假設要呈現bit1,就是將該值跟1(二進位00000001)做&運算
     bit2,就是將該值跟2(二進位00000010)
     bit3,就是將該值跟4(二進位00000100)以此類推…

我遇到了幾個問題點是一開始我直接將灰階做&運算後,做出bit層次愈低的切面會愈來愈暗。
應該是因為灰階色彩明暗度有關係吧!?

後來我將運算改為以一個變數來計算儲存該bit的值(1,2,4,...,128)
然後在做取餘數的運算之後值只會剩下0或1
再乘255就只會有黑跟白兩種色
這樣呈現出來的結果就是上面的那張圖。

簡單的說就是抓像素點然後做我上面提到的運算就大功告成了,
但是其中疑問及方法需要思考一下。

另外一個問題就是bmp圖檔的問題,好像是會造成記憶體讀取的問題?
那時候花了點時間調整變數以為是重複讀取得關係…
這問題有同學說出來了就是要使用24位元的bmp格式…
在做完第六個作業後就更證明是自己功力不夠…
因為HW6老師的程式碼是可以跑8bit的,但我將程式碼修改還是沒辦法

接下來的問題是BCB元件中功能不熟悉造成的
if else用bit來判斷要不要進入執行我寫的運算
因為我ComboBox設定為1~8,pow運算會有誤差,必須調整為0~7
判定式為互斥,但是卻發現我的if似乎會進入但是else也會進入!

後來發現ComboBox指向的東西為ItemIndex是造成我判斷時候出錯的原因
Text是框裡的值,而ItemIndex是由0~7…

附上一張將彩色轉灰階之後做位元切面的圖及彩色的位元切面…

2009年12月31日 星期四

HW4_Gamma校正

HW4:Gamma校正

首先是成果圖↓ 有Gamma值為2跟0.5圖






























補上對於這次作業所做的小資料,算是對於影像顯示的介紹


人眼對灰度變化的感覺比對色調變化的感覺來得敏銳

人眼對低亮度變化的感覺比對高亮度變化的感覺來得敏銳

而上述的第二項就是Gamma的緣由,也就是在較暗的影像時選擇較高的Gamma值,以犧牲亮部層次來換取更多的暗部表現

相對地,一些明亮的影像中就選擇較低的Gamma值以犧牲部分的暗部層次,來使得亮部層次更為明顯



由於之前的作業已經使用過抓像素點(其實是很久了…

Gamma整個運算部分 s = c * r^γ
這個部分在我剛開始了解Gamma的時候,就在想如何解決掉數值改變的問題…
後來我自己想到了一個錯誤的方法,是在跟朋友討論的時候用的
在開始寫程式前,我自己帶值來運算就發現出來的值還是有問題。
數學問題…數學太糟,不過已經解決了!

基本上會抓點改值再放回去就可以完成這個作業了(底子真的很重要阿…
由於整個程式我有一直做合併,所以很快就把Gamma校正完成,比HW3簡單很多。

最後是關於程式的部分
這個作業沒有什麼大問題,導致說不知道該如何報告這個作業?

簡單的介紹我對於這個作業如何去完成它
主要是分為三個部分:開啟圖檔、及抓取每一點、運算
開啟圖檔及動態宣告一個BCB所定義的Bmp來做運算其實算是基本
Graphics::TBitmap* BMP=new Graphics::TBitmap();

再來其實是運算優先,也就是把要如何運作及數值做調整後
最後將每一點抓取出來做運算後畫上去…

其實也就是在做影像處理時會進行的操作


2009年12月17日 星期四

HW3

修改過後圖片↓

將直方圖線條放大↓


找了網路上一些BCB的程式碼講解
(都跟直方圖沒什麼關係,找不到要的…)

經過更熟悉BCB,也就是VCL基礎終於弄懂我錯誤在哪邊

這個直方圖還沒有測試過到底有沒有抓錯…

花在要讀懂程式碼上面的時間遠遠大於我之後把全部需要的東西整個弄出來還要多很多…

還有一個小地方尚未修…就先放這張圖了
ColorBox的地方還沒有設定選到那顏色就會跑出來哪個顏色(還沒更改前三個的設置)

經過修改,這是把老師的範例程式做較完整的呈現
還沒辦法解決例外處理的部分…只能先透過將滑鼠指定好Load讀圖後就能解決這個問題…

----以下為更新過後------
修改掉之前錯誤的地方、圖片更新、心得增加。

關於ColorBox的地方改為使用RadioGroup方便點選…也不會出現一堆不相干的東西
現在想想應該是當初就設置錯誤才會出現那種問題(對元件的不熟悉

之前有提到關於例外處理的部分其實跟這沒有關係,
單純就是我在寫程式上造成某些值不能運算的錯誤。

問題就是因為我圖可能還沒讀進去,但是我卻因為其他的地方要使用到這項東西
例如我滑鼠移動到上面要抓像素…但是卻抓到空值這類的問題…

後來在上課有問老師,只要在Visible做設定就可以解決問題
讓那樣元件一開始是未啟用狀態,後面要使用到在開啟設為True

因為這個作業接觸到沒用過的元件,而且我在寫程式時想說能否使用其他東西來代替
也讓我學習到蠻多關於BCB內元件的使用。

2009年10月26日 星期一

HW2

時間又超過啦…

上課所講的方法其實並沒有很懂…

所以作業上網做了很多功課,也用了老師講的C++Builder6書籍來參考。

課程部分重點在於影像旋轉,下面是我遇到的問題

一開始動手完成最初版本是會消除到邊邊角角,
後來發現原來是中心點的問題(參考右圖)

但是我對部落格上的程式講解沒辦法有效的轉成我想要的程式碼,所以我就另外找了程式組合起來。

再來就是數學運算的部分,剛完成的時候我在變數設置的時候就把角度的部分寫死。

後來由於我想要可以自己輸入角度,所以就把角度換弧度的地方做更動變成(2*3.1416*angle)/360,如此就可以自訂angle

因為Edit1內的Text內容是Ansistring型態,我以為做(int)這樣簡單的強制轉換就可以改變…沒想到不行,而是必須使用.ToInt(),在BCB中應該很多物件內容屬於Ansistring,不過轉換方法很容易找到,沒有花到太多時間。

原本想直接釋放記憶體就可以再做一次旋轉,不過釋放記憶體後卻不能再做旋轉(會出錯)
使用Delete,不知道哪邊出了問題,所以現在也只能再重新開才能再次旋轉。

最後一個問題是,目前圖片檔案必須符合Image設定大小或是Image改成跟圖一樣,否則旋轉後會有黑色部分出現或是截到圖。
(Stretch設true沒用,可能是因為只是將圖縮放至預設大小,而旋轉是用Image設定做運算?)
↑問題已解決,將Autosize調整為true,如圖


需要手動…較麻煩,但是可以不限制圖的長寬,也不會有黑色部分出現。


如果有人願意指導一下,或是旋轉有問題可以來信給我(我不一定全盤了解…Sorry)。

下面是旋轉135度和150度的情形。
 

2009年10月23日 星期五

HW1

這是HW1的作業,作業還是要實際操作過,所以就先補上了。

作業不應該遲交這麼久,實在是很對不起。

---以下是作業部分----

關於動態宣告二為陣列部分

在老師的C++ Builder Programming Notes部落格中有提到,
還有就是在上課時老師說的學長作業參考,他將文字的敘述寫成code
我上網整個做查詢才整個了解。

用new宣告的時候做迴圈分兩層做動態配置,當然後面也是做迴圈來釋放記憶體。

另外還發現了使用malloc來做宣告的方法可以省掉使用迴圈的部分,
不過沒經過實測所以不清楚使用上會不會比較快速。

以上是這個作業所做的查詢

基本操作,BCB跑出來的畫面…