顯示具有 01361030 藍政歆 標籤的文章。 顯示所有文章
顯示具有 01361030 藍政歆 標籤的文章。 顯示所有文章

2015年1月18日 星期日

01361030藍政歆HW5

程式碼:點我

圖引:點我

這次作業做的是YUV色彩模型轉換
上圖為介面,已經將圖給叫進來,右邊分別為BG平面、BR平面、GR平面及UV平面,底下有對應的B/G/R/Y可以輸入,因為會做轉換所以Y可以跟RGB使用同樣的值

 上圖為4個平面在BGRY=0時的狀況
 

 上圖為轉換後的影像狀況,右下角為所點選轉換的色彩

 上圖為BGRY=100時的狀況

 上圖為轉換後的影像狀況

最困難的部分不外乎是YUV的色彩轉換,不過因為老師有給公式所以總體上也不會說難到一個無法的地步
            iC=iY-16;
            iD=iU-128;
            iE=iV-128;
            iR=((298*iC+409*iE+128)>>8);
            iG=((298*iC-100*iD-208*iE+128)>>8);
            iB=((298*iC+516*iD+128)>>8);
此為YUV轉RGB的轉換公式
再來是將圖轉換顏色,這個需要先將RGB轉成YUV再轉成RGB

            iY=((66*iR+129*iG+25*iB+128)>>8)+16;  
            iU =((-38*iR-74*iG+112*iB+128)>>8)+128;   
            iV =((112*iR-94*iG-18*iB+128)>>8)+128;   
 此為RGB轉YUV的轉換公式
途中需要把RGB換成所點選的RGB而非原圖的RGB
 
這次作業是本學期最難的作業,難度至少比之前的作業難上兩倍之多,什麼時候該怎麼轉換的邏輯是必要的,除此之外其實沒什麼

01361030藍政歆HW4

程式碼:點我

 (圖引id:47998307)


這次作業做的是濾波器,此作業有中值濾波器、平滑濾波器及銳化濾波器,圖.1是程式介面,已經把圖給叫進來了,此程式有個還原影像,可將影像還原成原本的樣子

然後先灑胡椒鹽(圖.2)之後進行中值濾波器(圖.3)
中值濾波器是找自己跟自己相鄰的8個點中排行第5的點,再讓他的值成為自己點的值,用此方法來去除雜訊。所以要先讓這9個點排序(泡泡排序即可),之後就容易找出大小第5的點,沒辦法完全去除是因為有時候雜訊剛好是排行第5,所以會讓自己的值變成雜訊的值。

之後是弱化平滑濾波器(圖.4)及強化平滑濾波器(圖.5)
平滑濾波器我還不太懂可以用在哪裡,不過做出來有讓圖平滑了一些。
弱化濾波器是將自己跟自己相鄰的8個點相加後除以9,再成為自己的值,大致上長得像下面的樣子
1 + 1 + 1   
(  1 + 1 + 1  )/9
1 + 1 + 1  
所以做出來會比較平滑一些

強化濾波器雖然也是相加在除,不過比重有差,自己的上下左右4個點要乘以2,自己則乘以4,相加後最後再除以16(1+2+1+2+4+2+1+2+1=16),再成為自己的值,大致上長得像下面的樣子
*1 + *2 + *1    
(  *2 + *4 + *2  )/9
*1 + *2 + *1   
  因為自己的比重最大,比較能保留住自己的值,所以感覺上變化沒有弱化來的明顯


最後是弱化銳化濾波器(圖.6)及強化銳化濾波器(圖.7)
 銳化濾波器把自己的特色強化,感覺上適合拿來找特徵點。
弱化濾波器是將自己點的值乘以五減掉上下左右四點的值,所以沒有用到角落的四個點,大致上長得像下面的樣子
+0  -1  +0
-1  +5  -1
+0  -1  +0
讓自己的特徵明顯

強化濾波器就用到了角落的4個點,將自己的值乘以9減掉自己相鄰的8個點,大致上長得像下面的樣子
-1  -1  -1
-1  +9  -1
-1  -1  -1
自己的特色更明顯了

 本次作業也比之前難一些,雖然濾波器的部分知道後就可以寫出來,但
bPtrImageRow=(Byte*)Image1->Picture->Bitmap->ScanLine[i];(這個是Image1)
        bPtrNewImageRow=(Byte*)Image2->Picture->Bitmap->ScanLine[i];
bPtrImageRow=(Byte*)Image2->Picture->Bitmap->ScanLine[i];(這個是Image2)
        bPtrNewImageRow=(Byte*)Image2->Picture->Bitmap->ScanLine[i];
哪個濾波器要用哪個必須清楚,這次卡最久的部分是銳化濾波器用到下面那一個,導致出來的圖非常奇怪,找了好久終於找到原來要用上面那一個,除此之外沒大問題,本次作業可以對濾波器有些認識,是個不錯的練習

2014年12月10日 星期三

01361030藍政歆HW3




程式碼=>https://www.dropbox.com/s/gyw71mm54tknvig/Unit1.cpp?dl=0
這次作業做色階的調整
 上圖為程式介面,工具列的檔案可將圖載入進來,下方為色階的調整部分,左方是上下限輸入出調整,給定上下限的輸入輸出然後依照比例來調整,右方是二次曲線調整,輸入(X,Y)座標後畫出拋物線後根據對應的output值調整
 ↑圖引(http://seiga.nicovideo.jp/seiga/im3991410)
一樣先把圖給叫進來,然後先進行色階調整
 上圖(左)是以輸入下限100上限200輸出下限0上限255做色階調整後圖的樣子,顏色看起來比原圖深,上圖(右)是色階調整的曲線圖
 上圖(左)是以(X,Y)=(100,150)做色彩曲線後的樣子,較原圖淺些,但不怎麼的明顯,上圖(右)是色彩曲線,是一條拋物線

程式部分,這次用了查表法來增加運算的速度,設兩個大小為256的陣列,一個給色彩調整,另一個給色彩曲線,將計算後的色彩值放到對應的位置,到時候需要轉換時只要這個陣列尋找就好,不用每個色彩值都重新計算,會省下許多時間

for(int k=0;k<256;k++)
        {
            if(k>iInputMax)
                iOneBox[k]=iOutputMax;
            else if(k<iInputMin)
                iOneBox[k]=iOutputMin;
            else
                iOneBox[k]=iOutputMin+(k-iInputMin)*((iOutputMax-iOutputMin)/(iInputMax-iInputMin));
        }
上面是色彩調整的表格製作,iOneBox是儲存運算後的色彩值的陣列,iOneBox[k]的k是欲運算的色彩值,等號後面的運算後的值是轉換後的新色彩值,到時候只要把原本的色彩值帶入k,然後就可以取得轉換後的新色彩值

沒有使用查表法的話,每個色彩值都必須代入運算,這樣要運算圖片的大小*3(RGB)的次數,而查表法的話只要運算256次+查表圖片的大小*3(RGB)的次數的時間

 再來為何要有k>iInputMax跟k<iInputMin的限制,因為要把色彩值限制在iOutputMax跟iOutputMin之間,而轉換公式iOutputMin+(k-iInputMin)*((iOutputMax-iOutputMin)/(iInputMax-iInputMin))是用相似三角形的比例概念推導出來的

fA=(fPointY-fPointX)/(fPointX*fPointX-255*fPointX);
fB=1-255*fA;     //這裡將色階取線的輸出值建表
    for(int k=0;k<256;k++)
        {
            fS=fA*k*k+fB*k;
            if(fS>255)
                iTwoBox[k]=255;
            else if(fS<0)
                iTwoBox[k]=0;
            else
                iTwoBox[k]=fS;
        }
上面是色階曲線的表格製作,fPointX跟fPointY分別對應(X,Y)的X跟Y,fA是在計算拋物線y=ax^2+bx+c的a,fB是在計算y=ax^2+bx+c的b,在這裡y=ax^2+bx+c的c是=0,故捨去

a,b,c都算出來了,代回去原本的方程式並將(x,y)給代入(此處的x,y是色彩變數)會得出fS,而fS>255跟fS<0的限制是因為色彩值是在0~255之間,所以不能超過這個範圍

這次遇到最大的問題是轉換後的像素需要新的BYTE*去存放,原本是直接覆蓋在bPtrImageRow[3*j+k]裡面,結果出來的圖跟想像中不一樣,之後用bPtrNewImageRow[3*j+k]來存放並顯示出來,圖才正常的轉換

  這次的作業比上次難了些,但還是想一想就有辦法寫出來的,比較麻煩的是公式的推導,但老師上課有講如何推導,所以實際推導一遍其實不算太難,就是要肯想肯實際去操作   

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年9月30日 星期二

01361030 資工三甲 藍政歆 HW1

我要介紹的這款APP是FxCarema
 是款簡單易上手的照片後製APP
當你第一次使用的時候,她會要你登入Facebook或是Twitter,算是當作帳號

登入完如上圖(左),他其實本身似乎也具有類似小型社群網站,能加好友也有聊天視窗(上圖(右)為好友視窗),不過社群功能不是本文重點,故放棄(雖然我也沒有用到)

上圖(左上)為拍照畫面,上方功能依序為計時、閃光燈、比例,下方依序為選取手機內圖片、拍照,這款的比例只有4:3跟1:1,若想拍其他比例的(如16:9)可以先用手機相機拍在過來這款後製,上圖(右上)為選取圖片,手機內圖片都可拿來後製,上圖(下)為選取後比例及裁剪,如剛剛所說,這裡只有4:3跟1:1,所以其他比例的可以後製但只能做裁剪,好了後按右上角勾勾
 
上圖(左上)為選取照片完的樣子 ,照片下方有很多模式可以選,上圖(右上)為選取X Blue模式後的樣子,跟原始圖比起來有差,個人感覺更有步道的感覺,下方的依序為裁剪、邊框(有些模式無,有的模式中邊框的樣式也不同)、調亮、上圖(下)的樣子(抱歉不會敘述)、其他功能
  



上圖(左)是其他功能,有三大類可以選,上圖(右)是選了Blue Tone後的樣子,變了另外一種感覺了,右上角的>>是下一步



上圖(左)是下一步後的樣子,可以撰寫相片敘述,有很多標籤可以Tag,還可以自訂,右上角的POST就是傳到此APP的社群方面(如上圖(右)),下方還可以同時傳送在FaceBook或Twitter

額外附贈:Waterdrop後的參考書


這款APP個人認為好上手,且功能不算太差,跟其他APP比較或許功能上有點少,但簡單的後製對我就夠用了,不過這款APP目前只有英文,雖然熟悉一下之後根本沒有差,算是一格小缺點