顯示具有 2013HW02 標籤的文章。 顯示所有文章
顯示具有 2013HW02 標籤的文章。 顯示所有文章

2014年1月3日 星期五

HW02

  Histogram 與 PS Levels, Curve 程式實作


這是我選用的圖

 
                                                               長條圖該如何求出呢??
掃描圖片上所有的點,
將RGB三個顏色的色階量都加起來,
每個像素點等同於陣列中連續三個位置RGB三個顏色的數值,
存入的順序不是RGB而是BGR



還未輸入Input、Output、min、max的原始圖
線性的需要4個數值
中間是透過4個數值形成一條線


Input min100 max200,
Output min5 max255,
輸入後的改變
Inputmin所輸出的值,
Output<100,
Inputmax所輸出的值,
Output>200,
圖就會很暗的很暗,
很亮的就會很亮。





                               

HW02

選擇的圖檔

這個作業讓我們開啟一張圖檔,並讓我們了解在這張圖檔裡的 R G B 含量分別為多少。

這是本圖檔 B 含量的直方圖

這是本圖檔 G含量的直方圖

這是本圖檔 R 含量的直方圖

這是RGB三個顏色的疊加圖

我們利用 256 的二維陣列去存取圖檔的的 RGB值,
並利用兩個迴圈分別取出再 0~255 之間 R G B 分別的值
並使用 MoveTo 與 LineTo出上方的直方圖。

Level 

我們輸入了4個值分別為 output 與 input 的最大值與最小值


hw 02 HISTOGRAM

這次的作業 是學期的第一個作業 也是影像處理的入門
就以這張狗狗的相片為例
學期初  我們所要了解的是色彩值RGB在圖片中的含量
基本架構是利用直方圖 和  2維陣列去存取

 這就是影像經過2層迴圈處理之後存取的RGB直方圖
可以看見RGB色彩值0~255的分布
但由於沒有寫出真正數值在圖表分析上
所以只能利用主觀的視覺判斷 顏色的主要分布

之所以要分析RGB的內容 是為了之後的影像處理功能做準備
許多PS的功能都是經由調整RGB而產生的
是基礎中的基礎

除了這是對基本色彩的認識之外
也是對於BCB IDE的練習和熟悉有很大的幫助
從 基本的BUTTON  和圖表的繪畫 版面的配置
圖片的載入 和  複寫 存取等等
都是之後的必要技能
而後在撰寫程式時 也會更加的方便熟悉

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月9日 星期一

HW02

HW2  這次的作業主要是修改Levels 以及使用 Curve。

從XE2旁邊的函式庫拉出各種Label及picture box就不詳細說明。



用數字變化在Form上面畫出相對應的直線函數是用以下程式碼
     :  MoveTo、LineTo、還有用Pen指定畫筆的顏色。


1.將最小值的輸入輸出設為相同,最後修改圖片的結果不明顯。












2.
但是將輸出的值調整至200~250
圖片明顯變白了。












3.
然後將輸出的值調整至10~100
圖片也因應程式碼變為較黑的圖片
表示程式碼內容符合當初設想的輸出結果!






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月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月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因為直接複製老師的程式碼做修改,所以沒什麼問題。
        我還是認為寫程式不難,而是熟不熟悉這個開發環境,要找想用的物件每次都找好久,有滿多都是問人才知道的~