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

01361073 游宇程 HW02

第一步. 上網找一張 .bmp的圖檔






第二步. 利用 MainMenu 來創造你要的版面,而 OpenPictureDalog是用來讀取圖片用





第三步 . 在 Image 裡面打上程式碼,如下
                                             if (OpenPictureDialog1->Execute()
                                         {
Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
iImageWidth = Image2->Picture->Width;
iImageHeight = Image2->Picture->Height;
                         }
此作用當程式run 按下 Image 可以讀取檔放在TImage2







第四步 .拉出一個 TPageControlg 上面貼上2個 TImage,一個用來讀取圖片,一個用來分析直條圖。然後再按鈕Red Histogram 裡面打程式,程式部分如下
                                       for(int l=0;l<256;l++)
                                   {
                                       if(RED[l]>iRMAX)iRMAX=RED[l];
                                   }
                                               for(int l=0;l<256;l++)
                                            {
Image3->Canvas->Pen->Color =(TColor)RGB(255,0,0);   //直條顏色
Image3->Canvas->MoveTo(l*2,255);       
Image3->Canvas->LineTo(l*2,255-(RED[l]/(iRMAX/255)));
                                            }
上述程式碼是用來畫出直條圖,分別在3個不同的按鈕中打上類似的程式碼






第五步 . 最後執行結果

最後此作業是經過上網查找以及詢問同學才能做出來的,謝謝!






2014年10月22日 星期三

01360095 資工三甲 俞憶婕 HW02


圖片色彩分布折線圖

程式完成圖
*圖片只支援副檔名.bmp



這次作業是要畫出照片的色彩分布,
程式的剛開始,當然是要先能載入圖片,
這部分老師在上課就講過了,
使用OpenPictureDialog元件就可以做到了。


然後就進入正題了,先計算出每個像素中顏色的分配,
利用"Histogram"按鈕觸發程式。

先利用"bPtrImageRow"載入圖片的Bitmap,
在宣告三個陣列B[],G[],R[]
用迴圈去計算每個Byte裡的RGB數值。



最困難的就是在畫圖的部分了,
剛開始沒想太多,直接用陣列裡的數字去畫,
結果發現數字太大了,會整個超過我原本畫的格子。



後來又想說那就把它除與某個數字吧
於是就寫成了這個樣子:Image3->Canvas->LineTo(k+1,105-(B[k]/100));
波形變得很小,而且如果圖片如果在更大的畫,還是會爆掉。



所以後來就想到那就用百分比去寫吧
先用一個迴圈去算出RGB的最大值,
B[k]/bMax*100去算出他的百分比
畫出了很奇怪的圖形,
使用ListBox去列出所有數字才發現,
因為"B[k]/bMax"計算時變成了0.XX,
而因為宣告時是使用Int型別,所以小數點後的數字會不見,
即使後來又"*100",但零成一百還是零,
所以只會出現100%的線。


調整後,寫成了B[k]*100/bMax
才終於成為跟Photoshop分析的結果相同的圖




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

HW2 99363031


PDF與CDF的直方圖統計

PDF



CDF

由於畫線很麻煩
所以使用BCB內建元件
TChart與TSeries
使用這2個元件就可製作統計圖

目前只處理BMP檔

由於三種顏色RGB處理都相同
所以將處理方法寫在fnCreateHistogram裡
再藉由呼叫並傳入不同參數處理不同直方圖 

CDF是在PDF寫完後才撰寫
所以直接使用PDF的結果計算CDF
 
另外直方圖是否正確就沒驗證過了
其他請參閱程式註解
























01360494 林杰儒 HW2

01360494   林杰儒   HW2
今天要來分析圖片的像素色彩值
所以我就挑了一張花蓮的風景照來分析

這邊要注意!!,圖片只能用bmp的圖
因為後面用的讀圖片的原件(OpenPictureDialog)只能讀取bmp的檔案

再來就是把圖片讀進去了
這裡會用到元件 
If(OpenPictureDialog1->Execute())
Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName)
這樣就可以了,他是利用對話視窗來確認你要不要將圖片傳入
這邊會有布林函數,如果你按確認,會有1傳入,如果按取消,則回傳0


再來就是色彩值得輸入
bPtrImageRow=(BYTE *)Image2->Picture->Bitmap->ScanLine[i];
用指令存像素點時要記得
這邊不是RGB!而是反過來的BGR! 
我利用三個陣列來存BGR的值
藍色: iBlue[bPtrImageRow[3*j+0]]++
                             綠色: iGreen[bPtrImageRow[3*j+1]]++                          
 紅色: iRed[bPtrImageRow[3*j+2]]++

再來利用Move to()與 Line to()
將點與點之間連接
並存入對應的BGR的image裡面
就完成了!!

還有一張負片的像素分析

程式碼:https://www.dropbox.com/s/t6g5ns1nkgck99k/10741644_926650557352772_1595989763_n.cpp?dl=0