2013年11月20日 星期三

HW02

這次作業是 Levels 與 Curve 圖 ,和 Histogram,首先是 Levels 與 Curve 圖:

這是原圖

接下來是經過 Levels 處理後的影像,

處理完成圖與曲線圖

做這個實在是很耗精神力,大部分時間我都花在排版上與尋找元件,想做的和老師的一樣漂亮,但還是無法,我不知道怎麼把 Curve 的 Image 做出邊框,像老師的邊框就是綠色的,而且在 PageControl 裡還有小的 PageControl,真的是版面很整齊;還有另一個頭痛的地方就是 XE2 的破解好困難,破解檔丟了進去指定目錄但會有無法開啟軟體的錯誤,搞得我要每開啟一次就破解一次,不然 XE2 在 compile 幾次之後就不給我 compile 了。

Curve 圖也是個大問題,還有之前遇到的程式寫好了但把 Input 和 Output 改了之後圖片還是沒有任何變化,之後就用老師所教的,利用 EditChange 來做就成功了,但我有個疑問,一定要使用 EditChange 才可以嗎?因為使用 EditChange,程式碼會多出四個 Part,這樣就無法節省程式碼了。

另外程式碼部分在期中考時有寫錯,看了老師的公式後就懂了,沒什麼大問題。

這是更新過後的介面

之後是新加的 Histogram 功能:

新加的 Histogram 功能

沒調過的 Histogram 真的很醜,線都黏在一塊,所以想著要調間距,就把 X 軸都加 3 下去,結果還是沒變阿!!
才覺得奇怪,加 3 只是把 X軸往右移 3 而已!!要*3阿!!但是視窗不夠大,我就只成上了1.5而已不過也好看多了。


間距1.5的 Histogram

這下子算是大功告成,HW02 かんりょう!!








2013年11月17日 星期日

HW2

這次的作業....老實說我忘了是要用什麼
於是就把目前做的都先Show一次
至於說下面的排版....是因為截圖時沒注意到多了下面的白色區塊
為了不讓文章看起來太長
所以就先這樣排版Orz....
寫完這篇文章後發現Fliterㄙ做完了
但忘了拍下來
過兩天再補上
(雖然Fliter似乎是這禮拜說的....因該不是這次作業要展示的東西)
然後Memo是為了測試方便所放的
忘了將他移除掉
然後有些程式碼可以做一下修改
大致上差不多是這樣了
東西雖然前幾天都做好了
但是....這文章寫起來也不知道要寫些什麼內容
每次都要寫很久
所以拖到今天才開始寫

為了測試方便
所以一開始就有先寫死一個路徑給他
但是仍然可以自由地開啟圖檔
然後提供使用者能儲存修改後的影像
然後這是Inverse的功能....
老實說....赫然發現半夜看這東西還蠻可怕的
這是做了Level的功能
這次提供的示範
將原本50~200的像素值
變成了0~255的範圍









這是Level做出來的圖












接下來是實作Curve
我在功能列->Image->Curve 裡面給了個bool的變數
當按下Curve按鈕後
便會出現這段訊息
此時bool變數變成1
Level上的影像才可供使用者點選第三點
當影像處理完時
bool會自動鎖上
避免使用者造成奇怪的錯誤
(雖然我不知道會有什麼錯誤.....但為了安全起見  就給他上鎖吧)

這是Curve的圖













成果就變成這樣了
至於說為什麼都是這個人....
因為第一次寫這程式時他剛好換FB的大頭貼
所以...就偷偷把他給賣了









接下來就是Histogram了
這邊提供了放大與縮小的方法
至於原本為什麼是300
那是因為Rect的高度我是給300
所以當值經過
paint[0]=Histogram[0][i]*Magnification/Histogram_total[0];
的運算後
才會是0~300的值
其中paint[0]是畫在Rect上的藍色像素點
所有的0因該都是k
為了說明方便就先把它改成了0
Histogram[0][i]是藍色像素點在i位置上的數目
Magnification是倍率  預設300
Histogram_total[0]是藍色像素點的總數目(其實突然發現Histogram_total[]三個的值因該都是一樣的....過兩天再來更改)                                                                                                                                                                                           

至於這個圖就是....非累積的Histogram
由於計算方式的問題
所以如果Magnification給300
那會看不太出來
所以這時按了N次的放大
將倍率變成9600
這時才出現這樣的圖

2013年11月15日 星期五

HW2

這次的作業有三個小部分 : Levels、Curve 和 Histogram

Levels 色階


  此功能可以處理影像的對比亮度。輸入四個整數值 ( InputMin . InputMax . OutputMin . OutputMax ) ,X 軸為 Input 的值,Y 軸為Output 的值,當值有變動時,就要重新畫圖以及計算。上圖中的 Original Image 為 Load 進來的圖,當 Original Image Load 進來時  New Image 也要跟著 Load 進來,不然當要執行 Level 計算時會出現 Error,因為通常 bitmap 元件在還沒放進影像時,是沒有配置記憶體的,所以會出現如下圖所示告知使用者 scan line 超出範圍。


主要程式碼
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) ;
         }
 }

================================================================
Curve 曲線


  此功能和 Level很像,一樣是在處理影像的對比亮度 ,不同的地方是 Level 是給予一定的範圍,利用 InputMin . InputMax . OutputMin 和 OutputMax 計算並畫出 Level 的圖;而 Curve 則是在圖上點一點,並利用曲線公式 (y=ax^2+bx+c) 將圖上的一點帶入並連接計算出 Curve 所執行出來的結果。上圖中的 Original Image 一樣為 Load 進來的,Load 進來同時 New Image 跟著 Load 進來,避免再次出現 Error,曲線中的紅點為使用者所點的,按下 Curve Button 就會更新 New Image 的影像了。

主要程式碼

for (i=1;i<255;i++)
{
        iCurveTable[i] = (int)(( fCoeA * i * i + fCoeB * i) + 0.5);
        if (iCurveTable[i] > 255)
            iCurveTable[i] = 255;
        if (iCurveTable[i] < 0)
            iCurveTable[i] = 0;
        imCurve->Canvas->LineTo(i,255-iCurveTable[i]);
 }
 imCurve->Canvas->LineTo(255,0);

================================================================
Histogram 色彩統計直方圖


  此功能在做 Red、Green 和 Blue 三個色彩的統計,利用統計的方式可以了解到三個色彩分佈的值有多少。如上圖所示,點選要顯示出來的統計圖,並點選左上角的主選單第二個Image 裡的 Histogram (如下圖所示)就會出現色彩統計方圖。


主要程式碼
for (j=0;j<iImageHeight;j++)
{
bPtrImage = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
for (i=0;i<iImageWidth;i++)
for (k=0;k<iChannelNumber ;k++)
 iHistogram[k][bPtrImage[i*3+k]]++;
}
================================================================

  這次的作業感覺起來好像很難,但大部分的程式碼都給了,所以難度降低很多,不過還是有很多小問題,像是程式打完可以執行,但為什麼執行到一半出現 Error,自己也不懂問題出現在哪,英文也只看得懂超出範圍,但不知道是什麼東西,於是將訊息截圖問老師此錯誤訊息是什麼,一問之下才知道輸出的影像要和輸入的影像一起 Load,不然影像在做 scan line時會找不到位置去記,於是我將影像輸出的地方先做和影像輸入的動作一樣 Load,就解決了超出的範圍。

  做 Level 時,要知道當值小於InputMin時,輸出值為OutputMin;值大於InputMax時,輸出值為OutputMax,這些搞混的畫圖就畫不出來,執行結果也會是錯的。

  做 Curve 前的公式推導很重要,不懂拋物線方程式的話就無法完成話曲線的動作,點一點要知道座標,並將座標帶入拋物線的公式裡,才能畫出曲線。

  做 Histogram 時,要裡用陣列存取紅、綠、藍三色的值,並利用 for 迴圈將相對應的值去做加一動作,最後輸出利用對應的畫筆顏色將對應的值畫在畫布上。

2013年11月14日 星期四

00363073石維仁 HW2

寫好了程式忘了要交報告....
這是本次的祭品
第一次的作業,呈現直條圖

由於是紅藍色系的圖所以看不太到綠色
CODE
其實一共寫了2次...第一次教的時候就寫了出來...上傳到雲端後被其他科的程式覆蓋掉了...(淚目
LEVEL後的效果
輸入的最小值由40加到50
輸入的最大值由230變為200
加入CURVE的值
在這張圖沒辦法得出很明顯的變化....

心得
其實修BUG和排版花的時間比較多,看到這些功能會覺得自己進步很多,也發現市面上的修圖軟體所需的程式能力並不高,主要需要的反而是如何想到這個點子,因為寫了這個作業還多聽到了2個半小時的自由軟體演講...算是意外中的收穫吧??




HW02


Levels是仿照photoshop裡的色階所寫出來的程式
所以最小值輸入越大顏色更黑,最大值輸入越小顏色更亮
而最小值輸出是越大顏色更亮,最大值輸出越小顏色更黑
不同的是輸入是會讓整個顏色變深(最小值越大)或曝光多寡(最大值越小),輸出則是整個顏色越來越白(最小值越大)或越來越黑(最大值越小)

原圖(沒有更動)















這是把最小值輸入調大一些,很明顯的看到整體顏色變的很深















這是把最大值輸入調小,會很明顯的感受到曝光過多















這是把最小值輸出調大一些,會看到整個顏色都比較白















這是把最大值輸出調小一些,會看到整個顏色都變暗了
>















以上就是把輸入或輸出的值調大或調小所得出來的不同結果


而這是按照老師的範例很順利寫出來的程式,也加了註解上去。雖然有四塊程式,但因為只有第一行比較有所不同,所以只貼了這張















而這是我的執行鈕的程式,一開始把iImageHeight.iImageWidth.i.j.k設在裡面,所以程式跑不動,之後放在全域才能成功執行



















接下來也是仿照photoshop裡的曲線所寫出來的Cruve
它也可以做到跟色階一樣的功能,不同的是它是用曲線來表達



原圖(沒有更動)















下圖所呈現的曲線會讓圖曝光,也等同於levels輸入值的最大值調小















而這圖所呈現的曲線代表會讓圖變白,也等同於levels輸出值得最小值調大















這圖所呈現的曲線是讓圖的色澤更深,也等同於levels輸入值的最小值調大















而這張圖所呈現的曲線是讓圖整個變暗,也等同於levels輸出值的最大值調小















因此Cruve也可以辦到levels所呈現的圖,只是一個用數字選擇,一個用曲線選擇,但之後所呈現的曲線相似的話,所影響的黑白亮暗其實是一樣的


因為老師有給範例,所以大致上程式沒問題,除了像上面所說的要放在全域而我放錯地方才會出問題。反而弄最久的是一開始沒背景顏色,曲線就像飄在上面一樣,看不到X.Y軸,然後Pagecontrol又沒辦法選背景顏色,於是查了一下發現可以用Panel放在後面然後改顏色


接下來是histogram部分,主要是用陣列去儲存三個顏色的值,然後再個別掃描就好,只不過一開始的圖長的很怪,都一樣胖,之後才發現是fHistogramScalar得值不能設太大

這是跑出來的圖



































2013年11月13日 星期三

HW02

HW02

  這次的作業是關於photoshop裡各種分析、改圖的顏色的功能~

1)
  首先一開始當然要先將圖片載入
if(OpenPictureDialog1->Execute())
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);


2)
a.再來我們要做的是Histogram,分析圖片裡RGB的值(0~255)各有多少

for (j=0;j<iImageHeight;j++)
{
bPtrImageRow = (Byte *)Image3->Picture->Bitmap->ScanLine[j];
for (i=0; i<iImageWidth;i++)
for(k=0;k<3;k++)
iHistogram[k][bPtrImageRow[3*i+k]]++;  down的時候為--
}

b.
  因為在這用了"原始"及"累積"的差別,所以以下為"原始"

if(RadioGroup1->ItemIndex==0)
{
for (i=0;i<256;i++)
{
iHB = int(( float(iHistogram[0][i]) * fHistogramScalar ) + 0.5);
iHG = int(( float(iHistogram[1][i]) * fHistogramScalar ) + 0.5);
iHR = int(( float(iHistogram[2][i]) * fHistogramScalar ) + 0.5);
if(CheckBox3->Checked==true){
Image4->Canvas->Pen->Color = clBlue;
Image4->Canvas->MoveTo(i*3,256);
Image4->Canvas->LineTo(i*3,256-iHB);}
if(CheckBox2->Checked==true){
Image4->Canvas->Pen->Color = clGreen;
Image4->Canvas->MoveTo(i*3+0.5,256);
Image4->Canvas->LineTo(i*3+0.5,256-iHG);}
if(CheckBox1->Checked==true){
Image4->Canvas->Pen->Color = clRed;
Image4->Canvas->MoveTo(i*3+1,256);
Image4->Canvas->LineTo(i*3+1,256-iHR);}
}
}

c.
  再來則是"累積"
if(RadioGroup1->ItemIndex==1)
{  iHB=0;iHG=0;iHR=0;    down的時候要加此程式碼不然會出錯
for (i=0;i<256;i++)
{
iHB = iHB + iHistogram[0][i];
iHG = iHG + iHistogram[1][i];
iHR = iHR + iHistogram[2][i];

if(CheckBox3->Checked==true){
Image4->Canvas->Pen->Color = clBlue;
Image4->Canvas->MoveTo(i*3,256);
Image4->Canvas->LineTo(i*3,256-iHB/5000);}

if(CheckBox2->Checked==true){
Image4->Canvas->Pen->Color = clGreen;
Image4->Canvas->MoveTo(i*3+0.5,256);
Image4->Canvas->LineTo(i*3+0.5,256-iHG/5000);}

if(CheckBox1->Checked==true){
Image4->Canvas->Pen->Color = clRed;
Image4->Canvas->MoveTo(i*3+1,256);
Image4->Canvas->LineTo(i*3+1,256-iHR/5000);}
}
}

3)












這裡做的是Level,運用數學的比例公式運算出來,再點擊Apply讓圖片作變更。
程式碼有點多就不貼出來了~













最後則是Curve,直接將滑鼠點在Image上,用到了Events裡的MouseDown,也是點擊Apply讓圖片作變更。


心得:
      這次的作業相當的精彩,自己做出來相當有成就,雖然一程式部分是老師提供的,但我想自己寫也不會寫不出來,只是會花很多時間做修正,畢竟邏輯通了,程式就容易多了。
        遇到的問題其實都不太是程式方面的問題,其中花最長時間的即是圖片檔弄錯,導致溢出記憶體,一直找不到問題,最後才發現圖片雖然也是BMP檔,但位元深度卻是8而非24。之後則遇到Histogram裡up、down的問題,關鍵的問題是在有分2種分析,原先的"原始"圖我直接分別在up、down裡做iHistogram[k][bPtrImageRow[3*i+k]]的++及--,這樣的效果即是每點一次色彩值的數目就會加減1倍,但當點選"累積"圖做down的時候卻出現異常,最後則在選到"累積"時先做iHB=0;iHG=0;iHR=0;,再進入for迴圈做畫圖,如此即解決此問題了。最後的Level及Curve因為直接複製老師的程式碼做修改,所以沒什麼問題。
        我還是認為寫程式不難,而是熟不熟悉這個開發環境,要找想用的物件每次都找好久,有滿多都是問人才知道的~












HW02

這是第二次的作業要做Histogram 的統計和Levels的畫圖。

第一張原圖
 第二張原圖的Histogram統計長條圖

第三張Levels和曲線圖
Levels產生出來的新圖

做完了這次的作業,感覺超新奇,這些功能都跟用Photoshop修圖的結果一樣,雖然原理很簡單,但因為我對於XE2這個工具不熟加上程式能力沒有很好,讓我苦惱許久,於是請教了一些同學,最後終於做出來了,讓我覺得原來Photoshop的那些小功能並不難。

HW02

第二次的功課是Histogram
老實說   這次功課真的讓人大開眼界
學到了新的功能讓人相當開心

(這是原圖)↑

接著   利用Histogram功能
便會產生下圖這樣的色素統計
而Level功能可以改變圖片色素量
 下圖為改變後
雖然對於程式的地方還不是說非常厲害
但是對於學習者來說
問問題是個讓自己也是別人一起進步的好方法
透過問問題來學習自己不懂的
更何況能夠利用BCB就做到和PS類似的功能實為一大感動