2009年10月16日 星期五

HW02

這次的作業是在做影像旋轉
感覺一直要算角度
所以很麻煩
不過我先以對角線當做新圖片的寬高
然後再計算圖片旋轉後的大小
動態宣告一個二維陣列存放旋轉後的圖片
在轉圖的時候 i 跟 j 很容易搞混
所以 x軸跟y軸要非常清楚才行
不然很容易就會轉錯邊
這次也決定用LENA的圖
用了好久角度好難抓
一直找不到原因
試了幾次終於試出了
作業越來越難
所以要加油了

hw1


作業上傳說實在的,實在是有點晚了。
不過BCB這程式我使用上真的是困難重重,第一個是連安裝檔都沒有,好加在有朋友協助、第二個是沒有用過這個程式編輯,他的程式跟C#差不多,但是寫起來又有點那麼的不同、要在有限的時間內抽出時間學習BCB....總之這個東西寫得出來真是費盡我千辛萬苦,雖然程式碼東剪西貼,不過要弄懂也是花了段時間。

2009年10月15日 星期四

hw2 (修正版)

示意圖















由於先前的不是課程上所要求的

所以就重做了一下



不過還是看得出來旋轉後的圖失真了

我自己在想

會不會是因為原圖的Pixel都是int值

旋轉到目標角的點上時發生float問題

新像素的初始值原本都是整數點

所以旋轉的過程當中

一出現小數點就Null

導致圖片失真了



所以我在想,是不是需要使用反鋸齒來修飾失真的問題

不過一提到反鋸齒好像又把問題搞大了不少

但是新的像素原本就是一個一個像素點構成

就像

口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口
口口口口口口口口口口口


所以如果像素點一轉到口跟口的中間

就只能被Null掉

畢竟新創的畫布也是一個一個整數點構成的

旋轉成傾斜的不太可能不會失真

我也不知道我說的對不對

不過個人感覺是如此啦

HW2 - 影像旋轉

這次的影像旋轉真的有難,難在太數學了...

把找得到的公式copy上去後,我得到下面這個結果:















右邊是旋轉過的圖片,很明顯的可以發現有很多小白點.
這是由於在旋轉的計算過程中,有些點會因為四捨五入的關係而被忽略,進而未被處理到.

嗯...該怎麼說呢......(假設原圖開在Image1,處理過後秀在Image2)
如果將原圖的座標換後填入Image2,那有些點被捨去後就會留下白點.
所以換個角度想,那如果先算出Image2需要多大,再反推回來求對應在Image1的點,那就不會有這問題.

至於偏移的問題,公式在網路上就可以找到了,就不在這裡多談.
下面這張是順時鐘旋轉37度:

















下面這張是逆時鐘旋轉75度:

2009年10月13日 星期二

第一次學BCB這軟體

感覺有點陌生

之前因為沒有這個軟體

所以一直到現在才上傳

呵呵

不過

經過同學和老師的指導之後

總算是做出來了!!!


我相信

經過之後的課程

和自己多練習之後

應該可以做得更好 ^^



2009年10月11日 星期日

Hw2

1011

這次作業是做旋轉,之前在多媒體概論的時候有自己做過90度跟180度的旋轉。
所以自以為的這次的也應該不會太難.....但是在實做的時候發現有很多的東西要考慮。
首先是旋轉的角度,怎麼樣在旋轉過後讓圖片完整呈現出來。
再來是第二個陣列的容納量可否容納的下旋轉過後的長跟寬。這都是必須要去考慮的~"~
實際打了程式試驗完以後,卻發現圖片是旋轉了但是有被剪掉的和重複到的地方。

問題:

圖片重複的地方我猜測是演算法的錯誤,因為我在裡面有用到abs函數,所以數值有可能重複。

而被cut掉的地方我想用圖片的位移不知道能不能解決.....

待續@_@~


1015

經過幾次的測試....它終於可以正常旋轉了....
在程式碼方面,跟上一個圖案的差異性滿大的。
首先,因為之前是拿第一個作業的程式碼下去改寫的,所以一直陷入去對RGB陣列的元素做運算的迴圈。後來才想到,其實好像不用,只要把圖片的點旋轉就好,不需要用到RGB。

再來是使用cos sin函數 發現其實只要直接使用include裡面的math就可以使用cos跟sin這兩個函數了= = 不用自己在那裏亂算~"~

因為我是直接使用Image1->Canvas->Pixels[j][i]=Image2->Canvas->Pixels[j][i] 所以圖片在旋轉後多出原始圖片長寬的部分就被剪掉了@_@~這方面還沒做改進。

剩下的就是數學的公式了~旋轉的角度以及旋轉後的位置都是要考慮的因素~不然圖片會處理完後會亂跑= =

還有一個問題就是.....轉完以後顏色會稍微失針@@~~這我就不知道怎麼解決了~"~

2009年10月10日 星期六

hw2














這是我demo的介面.在寫作上.我用很多沒有效率的方法來避免問題.
像是宣告一個足夠大的陣列來存放旋轉過後的圖片.邊界問題則用平移來解決.
不過即使這樣.我還是遇到一些計算上的困擾.
像是弧度量轉角度.因為在使用cos sin這些函數.這些函數的內定直是給弧度量
而我們比熟悉的卻是角度.所以需要稍微轉一下

這公式給大家參考一下:
th=(angle*3.14159)/180;//th是弧度量 angle則是角度
// 輸入角度之後用這公式轉呈弧度帶入function


看似好的成果其實有很多瑕疵.像是上面這張deom我就用完美的角度來轉.90180...等.在旋轉上不會有破碎的問題.但如果遇到其他的角度.則會有圖片破碎的問題


















因為在旋轉計算的過程.小陣列轉到大陣列裡.總有一些直沒辦法完全的填補過去.所以會有破圖的情況.也因為這樣.圖像多少會有變大或縮小的感覺.

給大家一個提醒:

在轉圖的時候 i 跟 j 很容易搞混 x軸跟y軸要非常清楚才行.一開始我沒有用很清楚.轉出來的圖會不同邊

2009年10月9日 星期五

HW01















這個作業其實還蠻容易的
只是用程式來開啟圖片
然後顯示出RGB的值
因為是二維陣列的圖
所以還要去設定它的長與寬
雖然一開始宣告的部份遇到了小小的困難
因為我ㄧ開始只宣告一個二維的陣列
所以到後面就不知道要怎麼讓程式順利的執行
結果
才知道因為有R.G.B三種
所以要宣告三個二維的陣列
害我搞了老半天
雖然二年級有學過BCB
但其實我的程度也不好
所以對於這第一個作業
有點陌生
出了點小差錯
不過好再解決了
也順利的把作業給做出來

HW01


程式的部分:

首先先開啟一張bmp圖片
OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

再來我要取得圖片寬高
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap);
iImageHeight= Bmp->Height;
iImageWidth = Bmp->Width;

宣告三個二維動態陣列
try
  {
   ucMR = new unsigned char *[iImageHeight];
   for (j=0;jucMR[j] = new unsigned char [iImageWidth];
  }
 catch (std::bad_alloc)
  {
    ShowMessage("Could not allocate memory...Bye");
    exit(-1);
  }

取得圖片RGB值分別存入陣列
for(i=0;iHeight;i++)
  for(j=0;jWidth;j++)
    {
     ucMR[i][j] =GetRValue(Image1->Canvas->Pixels[i][j]);
    ucMG[i][j] =GetGValue(Image1->Canvas->Pixels[i][j]);
     ucMB[i][j] =GetBValue(Image1->Canvas->Pixels[i][j]);
    }

顯示RGB值輸出

if (Image1->Picture->Bitmap->Empty!=true)
 {                   
  Form1->Label1->Caption=AnsiString(ucMR[X][Y]);
  Form1->Label2->Caption=AnsiString(ucMG[X][Y]);
  Form1->Label3->Caption=AnsiString(ucMB[X][Y]);
 }
這堂課是用BCB的程式來做的
以前有別堂課的老師有用BCB來上過課
所以還算容易上手
但是有一個地方有點不知道該怎麼做
後來問了別人才了解
如何讓滑鼠隨著移動顯示RGB值
實作方式就是在顯示圖的物件上點一下再到左邊的小視窗
把標籤切換到"Event"後有個叫"OnMouseMove"的欄位
在空白欄位上快點兩下
就會在程式碼那看到一個空白的副函式
它的宣告變數中就有X和Y
所以可以利用這兩個變數去控制顯示滑鼠目前所在的位置的值
好不容易解決了問題
順便提到
LENA的圖片好正ㄏㄏ
大家看了應該也會很開心吧
第一次做影像處理的作業
還需要更了解關於制方面的事 
相信下次應該會更好!

HW01


這是一個成功的圖片,有算出這張圖RGB的總合,不過在宣告二維陣列的部分還是有一些小疑問,不知能不能問老師。



還有這是一個成功讀取得圖片(當紅的臉書餐廳),可是問題是讀不出他的RGB值,明明都是RGB圖都可以讀入,但為什麼上面圖可讀出下面的就不可呢?
是個讓我有點疑惑的地方。