顯示具有 95360760 劉育成 標籤的文章。 顯示所有文章
顯示具有 95360760 劉育成 標籤的文章。 顯示所有文章

2010年1月10日 星期日

hw8


在影像處理這門課上.有些人可能會覺得程式比較重.
但我覺得我學到比較多的是影像處理的概念.
透過一些簡單的方法把影像改變.像是我對之前的累加去雜質就覺得很神奇
還有透過累加.把模糊的影像變得清楚.這些在實做出來之後會讓人覺得很不可思議.也從中得到一些實做出來的成就感.
隨著課程的推進.漸漸開始用一些簡單的數學式子處理影像
我才發現很多影像.如果透過數學式子的轉換會變的很不一樣.
我覺得這幾門課就像一扇門一樣.引領進入影像處理的學問.也是在修完這幾門影像相關的課程之後才了解.影像儲存在電腦是什麼樣子.有了一些基本的概念之後.將來如果有機會遇到相關的東西.也不會一無所知.
要不是因為上一門視訊遊戲累積下來的經驗.我想我也不會寫這幾個程式.因為光是概念就要花一點時間去理解了.
我想說有很多在程式設計方面有才華的高手沒來修這門課
不小心造成增加被老師誇獎的機會.其實我一直覺得很不好意思!!
其實很多觀念並不是很難懂.要時做出來也不困難.
如果跟隨課堂的腳步.我相信實做是不難的.況且可以討論可以發問
其實老師常常在課堂上說的一句話會讓我莞爾.這句話可以建構出很多種想法
這句話是"我們等人多一點在講解核心內容好了".
這句話可以表達.第一節到課的人不多
這句話可以表達.老師不是很嚴格
有很多很多可以由這句話衍伸出來的想法

我也不是個標準的好學生.我會因為老師沒有很嚴格而遲到
但有時候我們也是可以稍微檢討一下自己的行為





hW7


這次的作業是Sobel 運算子實作:

因為同樣是影像透過矩陣來增加某些特性的顯現.所以用上次(第6次)作業來改的話會很快速
這次作業和上次作業的不同是.上次作業是把一張原本(清晰)的影像模糊化.
白話一點來說就是讓它看起來顏色不要那麼的分明有邊
上次是透過將原本矩陣所要顯示像素點的值.融入周圍像素點的值再行輸出.
就像顯示像素附有周圍像素的基因一般
這次的作業也是透過數學式轉換進而達到銳化效果.
鈍化跟銳化是一種顯示方式.銳化是將其影像的差異已更加明顯的方式呈現給我們

原理:
  我們將影像分為橫向差異跟縱向差異
   透過以下2個矩陣個別算出


Y維度的差異.......(擷取自來自維基百科)





X維度的差異.......(擷取自來自維基百科)




  ( X,Y 維度的矩陣很容易讓人搞混.因為0的關係.
   會因為整列都是0然後把他以為是水平的差異 )
  A矩陣為我們原始影像加上周圍八工格所形成的3X3矩陣
  當個別算出X和Y方向的差異.我們要再算出其橫向及縱向
  梯度近似值透過輸出其幾何距離即可完成:




這是我實做的畫面:

















 心得:
    在數學式子方面.說實在的我不是很懂.
    對拉式轉換也只有工數的印象.我只是
    透過老師上課解說.抓住那個key point
    銳化就是把他的差異量變大顯現.
    透過上述的2個維度算差異的式子
    求出幾何距離然後把作業完成.

2010年1月9日 星期六

Hw5

這次的作業是位元平面切片

原理:
因為顏色由8個位元儲存.所以我們可將其影像分成8個區塊重疊.
這次的作業就是要分別顯現出這8張圖像.
以例子來解釋.
假若我這一個像素點的顏色是0101 0010 (2進位)
則我們可以分成8(張)像素點的組成

  0101 0010    (想像它是由下面8張圖個別取1個位元組成)
-----------------------
   0000 0000   (第1張的像素點值)
   0000 0010   (第2張的像素點值)
   0000 0000   (第3張的像素點值)
   0000 0000       "
   0001 0000       "
   0000 0000       "
   0100 0000   (第7張的像素點值)
   0000 0000   (第8張的像素點值)

弄清楚觀念之後就要分別求出各張圖的像素點值.
以第一張圖來說.我們就是要留下第一個位元.
用"<<"或"&"皆可
我們可以把原來的像素值&你想要的位元
例如 我們要第一個位元:
 可以將
   0101 0010
&   0000 0001
 --------------------
   0000 0000
 要第二的
  可以
   0101 0010
&   0000 0010
 --------------------
   0000 0010
     "
     .
     .
     .
依此類推可得到各張圖的那點元素

以下是我實做的畫面:











心得:
 這次的作業只要利用到之前學的.把一張圖讀到手
 然後利用"&"(and)運算.記得把上述的2進制換成16進制
 0000 0001(2)=0x01 .就可以完成作業如果影像的顏色
 有問題.把使用的影像轉成灰階就可以了!



2010年1月7日 星期四

Hw6




這禮拜的作業是濾波器(spatial filtering) 實做
濾波器可以柔化圖片也可以使圖片更加的清晰

原理:
在於他將像素分成固定階乘的方行矩陣(square matrix)
然後再以輸入的方式來決定主要顯示像素會受到旁邊像素影響的比例多寡
然後再將處理完的影像輸出.我們這次實做的矩陣式3X3的矩陣,所以最中心的像素會受到周圍8工格像素的影響









\







以下是我實做的介面.一開始我的權重都設1
輸出的時候.他會保留本身的原本像素的1/9並融合周圍8格像素的各1/9
進而有柔化邊緣的效果



















當然我們可以自行決定周圍的影響比例.
這是拿10/18的原本像素值加上其它8工格的各1/18像入值比例的輸出




















當然如果你把周圍影響比例給他降到很低的話.會跟原來圖形很相似.肉眼分不出他的差異





















這次的作業困難度在於走訪的時候.
因為使用scaneline這指令.它在記憶體的走訪上是RGB值的方式
即使知道一小格一小格走訪.可是在邏輯上還是蠻難去釐清的
之前的視訊遊戲的概念是用加法的方式走訪.這次是用乘法的方式.
因為沒有確切的去把他想清楚.使得一開始在輸出上有遇到影像不全的問題.
不過做完之後也能多另一種走訪影像的邏輯概念很不錯!


2009年12月4日 星期五

HW4
















這次的作業有眼像photoshop的色片.藉由公式的轉換可以達到圖片的色彩轉換
這次的作業比較簡單.只需要在轉換的時候套上公式即可.過程也沒有之前的程式困難
相對來說這次的作業簡單多了

2009年11月2日 星期一

hw3

















這次的作業對我來說.比較困難是在畫圖的方面.再另行補上.先用Memo show出各個value矩陣的值.在value統計上.我用的是map資料結構來儲存.因為之前有做過類似的統計.當時是用map來儲存.所以這次作業我也用我熟悉的來做


==============================================

















這是補上的繪圖統計部分.稍微查了一下如何化線條.然後轉一下他的百分比.以免某些數值的個數高於我拉Image的高.這次的練習又跟第一次寫的不一樣.因為我發現我要繪圖的部分.如果那個值沒有存在於這張圖裡.則map資料結構裡不會有這值.而不是把這個值填成0.所以我另外又改回陣列的寫法.因為我們知道value的範圍是0~255.所以可以直接宣告一個256的陣列來統計和計算.最後在畫線條的時候.再去取得它的出現次數/百分比.

===============================================















我的作業告一段落了.因為沒有辦法一次做很久的時間.所以分蠻多次的.稍微介紹一下我的東西.
我有一個load圖片的按鈕.有一個計算的按鈕.百分比機制.因為怕在某個value的個數太多.會呈現一條線的狀況.所以用了一個卷軸來動態改變那百分比的分母.可以讓分佈更加的明顯.一開使沒有線條變色的觀念.看到人家這樣做也想學習一個.不過好像一直試不出來.最後透過同學幫忙.讓我有pen的概念.我只能說~感恩!!
在重重畫線Imge這部分也讓我卡蠻久的.因為一直沒有好的關鍵字下.所已找不到幫忙!不過後來還是有看到一行. Image2->Picture->Assign(NULL);這對我幫助蠻大的~

2009年10月10日 星期六

hw2














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

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


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


















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

給大家一個提醒:

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

2009年10月2日 星期五

hw1





































一開始在動態宣告記憶體的地方有點困惑.不過後來老師提醒一下就可以繼續了

程式碼部分.首先讀圖指令:

OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

然後取得該張圖片的長寬
可用以下2行指令
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap);

iImageHeight= Bmp->Height;
iImageWidth = Bmp->Width;

確切的意思我沒有很懂.大概式宣告一個圖形變數.把它和image1結合在一起


然後在宣告陣列.因為一個pixel有三元素RGB.所以各宣告一個陣列.所以總共是3個

 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);
  }


再來就是用for迴圈來儲存每個pexel的每個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]);
    }

顯示的部分:
if (Image1->Picture->Bitmap->Empty!=true) //因為如果還沒有讀到圖.滑鼠就到image的範
 {                   //圍會出錯.拿這if 來做預防
  Form1->Label1->Caption=AnsiString(ucMR[X][Y]);//X,Y為滑鼠移動在image上的位置
  Form1->Label2->Caption=AnsiString(ucMG[X][Y]);
  Form1->Label3->Caption=AnsiString(ucMB[X][Y]);
 }

心得:
因為之前有修過相關,所以在寫作上比較能容易上手.參考了不少別人寫的程式.看到不同的寫法.多少有些收穫.像是取得圖像的長寬便是從別的程式擷取過來的.基本上是以老師的東西做基礎.剪剪貼貼.不過有玩成一件事總事值得開心的~