2016年1月7日 星期四

資工三乙 02360386 柯明男 HW5

題目:Color Models

1.RGB色彩模型

原理:分成RGB三個切面
每個R切面就是 R值固定 BG從0~255
我做了功能 可以用輸入的 也可以用trackbar拉 也可以點圖選顏色
因為 這三個功能 RGB 都適用
所以就可以用 Sender 方便程式撰寫
例如:
講三個Edit都只像同一個事件
void __fastcall TForm1::TrackBar1Change(TObject *Sender)//呼叫事件時 會傳入一個Sender
 TEdit * TE = (TEdit*)Sender; //Sender 會知道誰傳過來的
if(TE->Name == "Edit6")  //藉由判斷知道 Edit的改變 要去修改甚麼
    {
        TB = TrackBar1;
    }
    else if(TE->Name == "Edit7")
    {
        TB = TrackBar2;
    }
    else if(TE->Name == "Edit8")
    {
        TB = TrackBar3;
    }
if(CheckTextIsNum(TE->Text)) //透過之前的程式 用來判斷是不是數字
    {
        if(TE->Text>=0 && TE->Text<=255)判斷 輸入的數字會不會超過0~255
        {
            TB->Position = StrToInt(TE->Text); 
            ShowRGB(TrackBar1->Position,TrackBar2->Position,TrackBar3->Position);
             //顯示RGB3個切面
        }
    }
而TrackBar 跟 點圖選顏色 也都可以利用Sender來方便寫

超重要一點!!

顯示這個地方 其實三個事件只要寫在其中一個裡面就好

因為一個事件的發生 也會觸發到其他事件的發生

如果每個都有 顯示 可能會變得非常的慢喔!!

2.YUV色彩模組

原理:將影像RGB透過公式轉換成YUV 以方便進行一些處理
也有其他轉換 例如: YCbCr (兩著的Y 都為亮度)
而這次使用的方式是 將Y固定 然後使用者選擇UV
這樣原始影像 樣子會留靠著Y留著 而 色彩值會隨者UV的變化而有不同效果
1.固定Y值 畫出UV  0~255的圖
會超快0~255 所以記得調整 其他沒有甚麼太大的問題 跟 RGB一樣的作法
Y為128時
Y 為255時



2.將圖讀出來 透過調整UV 來作調整

本次作業最大的BUG出現

Y = ((B*25+G*129+R*66+128)>>8)+16; 這裡的>>8+16

一定要用()分開 如果不分開 會配判斷成往右shift24次 這樣 怎麼都會是0

其他基本上沒有甚麼太大的問題 

此外可以在滑鼠點的位置點個紅點好分辨點哪個位子

成果:

 YUV都為128時 為灰階
影像的色彩為滑鼠點的地方
程式碼:點我

沒有留言:

張貼留言