2014年11月6日 星期四

資工三乙_01360221_陳鈺培_HW2

利用C++ Builder
將RGB值做取出的動作

原圖在此

PDF

CDF

程式碼: https://www.dropbox.com/s/wvz9cn6qicauoet/Unit1.cpp?dl=0

心得:
因為是第一次使用C++ Builder來撰寫程式,一直努力地用投影片來惡補基礎
程式碼也是在摧殘同學的耳朵和挑戰他的忍耐力之下完成真是辛苦他了
這中間還出現過PDF跑出來是整張填滿顏色的爆笑畫面
小細節雖然小但是真的非常重要,不然真的就只會有效聲充斥著你的世界了
相信以後會更加得心應手的!!



2014年11月5日 星期三

levels and Curve Adjustment

HW3:levels and Curve Adjustment

這次作業是levels and Curve調整
和上一個作業一樣需要先讀入檔案
但是比上次多了一個Scrollbox的元件
這個元件可以將圖像裝在一個固定大小的box內
可以較好的控制版面的大小


levels 是可以通過在右邊的方框內輸入數值
來調整input、output的最大、最小值。
輸入的方框用到Edit元件
iInputMin = StrToIntDef(edInputMin->Text,0);
用這行指令讀取Edit元件中的數值
StrToIntDef()函數是用來將字串轉成整數的
逗號後面的0為預設值


上方圖像會隨著Edit元件內的數值的改變而改變
iOutput=iOutputMin+(iInput-iInputMin)∗( iOutputMax-iOutputMin)/(iInputMax-iInputMin)
這裡用到了查表法
利用公式建立一個 levelstable[] 
將0-255的色階值通過公式對應的數值存入表中
實際進行影像處理時,只要透過色彩值做為索引值,
直接查出所對應的輸出值,不需要進行實際的運算,
就可以快速完成整張影像的轉換。
按下apply鍵后可以得到處理后的影像


Curve的部分可以利用ImageMouseDown 這個事件
來取得滑鼠在圖像上的坐標
利用(0,0) (255,255) 和滑鼠的點,三個點可以確定一個
二次函數
y=f(x)=(T-S)/(S-255S) x2+(1-255 (T-S)/(S-255S))x
其中(S,T)為鼠標的橫縱坐標
同樣利用查表法,可以建立一個Curvetable[ ] 
來存放轉換后的色階的數值


要注意當iCurveTable的值大於255
或小於0的時候必須將值強制設定為 0 或 255
如此影像才不會出現亮部突然轉換成暗部,
或暗部突然轉換成亮部的特殊情形
if (iCurveTable[i] > 255)   iCurveTable[i] = 255;
if (iCurveTable[i] < 0)   iCurveTable[i] = 0;


最後用到SavePictureDialog元件
Image4->Picture->SaveToFile(SavePictureDialog1->FileName);
可以將檔案存到想保存的地方

這次作業讓我對用bcb與使用者互動更加了解,
通過元件的event可以完成與使用者簡單的互動
同時SavePictureDialog元件的加入,
可以讓我保存下影像處理的結果。





資工三乙 01360636 周翃暐 HW2

C++ Builder 讀取圖片色階BGR三原色




以上為原圖
以上為C++Builder執行過後的結果
利用Adobe PhotoShop來做比較和驗證
發現兩者的色階是相同的
之所以紅色的尾段之所以有落差
是因為ImageWidth設定數值比較小
代表我所執行的程式碼無誤


起初碰到很多卡住的地方
經過同學的指導後 才慢慢地去寫出來
雖然在之前的"互動媒體"已經有了解過
但當自己去寫出來的時候 那股成就感真的不是蓋的

https://www.dropbox.com/s/9xx056lbc7hxgm7/Unit1.cpp?dl=0


2014年11月3日 星期一

資工三乙 01360451 黃詺皓 HW2

這次的作業要我們將一張BMP圖的BRG值取出
在畫出 CDF、PDF直方圖
原圖:
載入圖片:
 CDF:
 PDF:

心得:因為第一次用Builder來寫程式,不熟悉所以很多東西都要花時間尋找,雖然之前修
"互動媒體設計"的時候老師就有說過類似的東西,也寫了一些程式也是關於影像的處理
但是環境不同,使用的程式碼也不太一樣所以覺得滿有趣的,因為很晚才寫又聽了老師的
講解所以寫程式的過程中問題不多但還是花了一些時間,再接再厲寫出更好的程式

2014年10月29日 星期三

資工三乙 01360353 高子翔 HW2

了解題目:
這次的作業是利用 C++Builder
將一張BMP圖片的BGR值取出來

 撰寫程式:
在寫程式時有碰到一些問題
像是Image的座標
一開始在寫的時候沒有考慮到左下角的點是(0,255)才對
就會變成上下顛倒的直方圖
 還有對程式語言的不熟悉
像是 C++ Builder 不能使用%來計算
光是找這個問題就找到快崩潰
最後在同學的解答之下才找到問題
程式碼:
https://www.dropbox.com/s/gklmefgdew4qhqa/Unit1.cpp?dl=0

實做:
一開始先讀取圖片進Image
將圖片叫出來之後
然後利用Image裡面的BGR選項將BGR圖列出來
之後這張圖片所含的BGR像素數目就列成直方圖了

心得:
這次作業看起來雖然沒有很難
但是有一些小細節其實很重要卻很難注意到
但是做完之後對於像素的處理更加熟練
對於一些小問題的處理也更加得心應手


資工三乙 01360175 紀呈儒 HW02

作業說明:畫出圖片CDFPDF直方圖
遇到很多奇怪問題:
1.沒在.h宣告或重複宣告造成inverse效果做不出來
2.如圖PDF覆蓋在CDF上重新開圖片也CDF也會重疊
於是乎想要用clean()把Image清除
GOOGLE了一下似乎是不能用clean()也可能是我不會用
但我有找到別的方法可以解決
Image2->Canvas->FillRect(Canvas->ClipRect);
Image3->Canvas->FillRect(Canvas->ClipRect);
Image4->Canvas->FillRect(Canvas->ClipRect);
就是畫個白色方塊蓋過去
他會用方塊自動填滿Image不用設定大小很方便
 
 能準時交出這次作業的同學真的很厲害
他們遇到的問題可能更多更難
例如直方圖的比例
但經過他們的講解讓我們遇到類似問題可以更順利解決
心得:
雖然拖了很久才完成這次作業,不過做出來很開心
既然都遲交了就多做幾個按鈕玩玩
希望之後愈學愈多可以把這次作業的功能越做越多
多加了兩個按鈕可以原圖inverse互相轉換




資工三甲 01360504 謝樺欣 HW02

這次的作業需求為畫出 Image 中 RGB三原色 的PDF 和 CDF 。

我在Form中首先放入了【TPageControl】來分出〔原圖〕〔PDF〕〔CDF〕三個頁面,

並在三頁面各自放入一個【TImage】並使圖片開起至第一個頁面的Image,







之後我在第二個頁面加了三個【TCheckBox】來使Image可以只顯示R或B或G亦可同時顯示,

並且利用【TButten】來執行製作該照片的RGB PDF Histogram。

 Red Histogram

 Green Histogram

 Blue Histogram

 R&G&B Histogram




最後第三頁和第二頁相同版面配置,但我在第三頁卡了很久,因為Bug一直De不出來,
不過最終還是讓我找到Bug了,原來我提早做了除上共除數的動作導致顯示的直方徒都接近零,也在De Bug過程中發現了些許錯誤,以下就是我的 RGB CDF Histogram。

 Red  Histogram

 Green Histogram

 Blue Histogram

 R&G&B  Histogram

這次的作業做出來真的很有成就感,
我學會如何將一張照片分析成RGB的PDF和CDF,
這是我之前想都沒想過的,因此格外有成就感。

參考部分:我有在不太懂時看了幾位同學的程式碼,
並且消化吸收加上網路上的資訊及講義的協助下完成了該次作業。

下台一鞠躬...




2014年10月26日 星期日

資工三甲 01361030 藍政歆 HW2

程式碼 => https://www.dropbox.com/s/otc61q4ryfbuhqo/Unit1.cpp?dl=0
 這次作業要分析圖片的色彩值並做成直方圖


圖1.主程式的樣貌

圖1是主程式的樣貌,主目錄Open底下的Image是開啟圖片,C++ Builder只支援bmp檔請注意,Image底下的Add是將色彩值出現的次數加起來,Histogram底下分別為Blue、Green、Red,分別畫出這三個的直方圖及累積直方圖,下面的3個TabSheet 分別是開啟的圖、直方圖、累積直方圖,至於為什麼沒有改,因為還不會改

 圖2. 開啟圖片後

 
 圖引(id=8424385)

開啟圖片後的樣子如圖2,有加上ScrollBox使得圖太大可以拖曳(右方及下方),上方Image底下有個Add,按下去將會計算這張圖的色彩值次數


上方三張圖由上至下分別是Blue的直方圖、Green的直方圖、Red的直方圖
統計部分如下:
iBlue[bPtrImageRow[3*j]]++;
iGreen[bPtrImageRow[3*j+1]]++;
iRed[bPtrImageRow[3*j+2]]++;
由bPtrImageRow讀取每個像素點再由各個顏色相對應的陣列儲存




上方三張圖由上至下分別是Blue的累積直方圖、Green的累積直方圖、Red的累積直方圖,看起來好像一樣但其實是有差的
統計部分如下:
iBlueSum[0]=iBlue[0];
iGreenSum[0]=iGreen[0];
iRedSum[0]=iRed[0];
for(int k=1;k<256;k++){
iBlueSum[k]+=iBlue[k]+iBlueSum[k-1];
iGreenSum[k]+=iGreen[k]+iGreenSum[k-1];
iRedSum[k]+=iRed[k]+iRedSum[k-1];}
至於為什麼要事先先給第0個位置的值才開始迴圈,因為回圈內會呼叫k-1,從0開始的話會呼叫到-1,所以特別先做,迴圈的k也從1開始而非0


至於畫出直方圖的部分,一開始很單純就照著得到的值畫,結果理所當然的衝出去,所以要想辦法將圖給縮小,最後使用比例的算法
將每個值代入(x*450)/x-Max,用得到的新值畫圖
x是指第幾個色彩值,x-Max是指此色彩中最大的色彩值,目的是將最大值壓成450,其餘的值等比例減少,500是畫布的高而不是450,會設450的目的是想讓直方圖好看一些
比較大的問題是比例的部分,我最大的問題其實是─ 一開始拿來跑的圖是同一色系,導致直方圖某個值太大而其他值低到感覺不到變化,以為程式哪裡寫錯
本以為這次的作業不難,以為找色彩值是最難的部分,已經知道怎麼找色彩值而且老師上課又有教過,但發現到比例的問題時,才知道色彩值根本天差地遠,這次作業寫起來很好玩,而且又是馬上執行就看的到自己做的成果,寫出來真的有成就感。

2014年10月25日 星期六

99360816 張育瑋 HW2


程式的基本介面
左側顯示圖片
右側顯示直方圖和統計數字


Color Histogram


CDF

PS內建的Histogram比較圖

2014年10月23日 星期四

99360303 吳泓霖 HW2




黑框右邊有預留空間,所以不會全部塗滿。

https://www.dropbox.com/s/my3tjo0g68n1lnj/HW1.cpp?dl=0