顯示具有 s1081542 標籤的文章。 顯示所有文章
顯示具有 s1081542 標籤的文章。 顯示所有文章

2022年6月2日 星期四

s1081542 作業7

 

作業說明:

請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。

使用環境/語言:

  • Windows10
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 由於 erode及dilate,只能用於經過二值化運算的灰階圖片。因此先將圖片轉成灰階圖,並利用threshold對圖片進行二值化運算
  3. 經過二值化運算的灰階圖片代入erode,如此能讓圖片去噪、細化影像和消除毛刺。
  4. 由於 erode 會讓圖片的輪廓變細,因此需要利用 dilate 讓圖片的輪廓恢復正常大小,圖片會較清晰。
  5. 利用 HoughCircles,偵測圖中的圓形個數,圓形個數即為圍棋個數
  6. 根據圓形的圓心座標及圓半徑畫圓,利用circle函式畫圓。
  7. 使用迴圈,將偵測到的所有圓形畫在圖片上。
  8. 印完圖片後,回到第一點的流程
  9. 第一點的流程輸入0,則終止程式。

執行方式/畫面:

IMG_5702.JPG:(原圖:24顆圍棋,偵測:23顆圍棋)

image image

IMG_5703.JPG:(原圖:31顆圍棋,偵測:30顆圍棋)

image image

IMG_5704.JPG:(原圖:31顆圍棋,偵測:31顆圍棋)

image image

參考資料:

影片:



2022年6月1日 星期三

s1081542 作業6

 

作業說明:

請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。

使用環境/語言:

  • Windows10
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 主要有兩個檔案紀錄圖片的資訊:ColorDatabase.txtImageColor.txt
  2. 程式會將圖片出現過的顏色記錄起來,而且每種顏色都會對應到一組ID,並將這些資訊存進ColorDatabase.txt
  3. 程式會紀錄圖片中的不同顏色出現的狀況,並將值存到ImageColor.txt
  4. 舉例:假設圖片第一列的pixes分別是:白白黑紅,由於在ColorDatabase.txt中,白色是代表0號,黑色代表1號,紅色代表2號,因此在ImageColor.txt中紀錄的格式會是:0:2 1:1 2:1,這代表在第一列中,白色連續出現2次,緊接著黑色出現1次,再來紅色會出現1次。
  5. 程式壓縮圖片時,會產生ColorDatabase.txt 和 ImageColor.txt紀錄圖片資訊。
  6. 圖片壓縮率的計算方式:(圖片byte數) / [(ColorDatabase.txt 的byte數)+(ImageColor.txt的byte數)]

執行方式/畫面:

壓縮率:

image image image image

解壓縮的結果:(非原圖比例,原圖太大)

image image image

檔案資訊:

image image image image image

影片:



2022年5月10日 星期二

s1081542 作業5

作業說明:

撰寫一個程式將所附圖像flower.jpg的黃色花瓣區域擷顯示出來。

使用環境/語言:

  • Windows 11
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 將圖像從RGB color space轉成HSI color space。如此做圖形處理時,較不會有太多雜訊。
  3. 設定要偵測的顏色的數值範圍(此部分是要設定黃色)
  4. 將第三點設定的數值,代入inRange函式。此操作可以根據設定的顏色範圍,生成一張二值化的圖(此圖會將目標顏色的區域,設成白色)
  5. 根據二值化的圖白色範圍,重新設定原圖的像素顏色,如此即可獲得黃色花瓣。
  6. 印完圖像後,回到第一點的流程
  7. 第一點的流程輸入0,則終止程式。

執行方式/畫面

image image image image

參考資料:

 

2022年4月14日 星期四

s1081542 作業4

作業說明:

  • 計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階256色圖像方式呈現出。
  • 對圖像利用Gaussian Low-Pass filter處理,輸出平滑後圖像。
  • 程式利用課本的frequency filter步驟者可得滿分,在網頁中將每個步驟結果呈現出。直接套用opencv函數得一半分數。

使用環境/語言:

  • Windows11
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 輸入圖片欲模糊的程度。
  3. 讀取灰階圖片,並利用copyMakeBorder函式,將圖片的長、寬都調整為原圖兩倍。
  4. 新尺寸的圖片(padded image) 的型態換成CV_32FC1,因為要對圖片的每個像素乘上(-1)^(x+y),若沒轉型態的話會報錯,乘完後將型態轉回CV_8UC1,負數即會消失。
  5. 利用高斯低通濾波器的函數定義,求出高斯低通濾波器。
  6. 利用dft函式(傅立葉轉換函式),算出新尺寸的圖片(padded image) 的複數值,然後將複數值拆成實數和虛數
  7. 利用magnitude函式,將第6點的實數和虛數轉成振幅值,再將振幅值轉成對數,然後利用normalize函式,將對數做歸一化,如此即可求出原圖的頻譜大小
  8. 利用Phase函式,將第6點的實數和虛數轉成相位角度值,然後利用normalize函式,將相位角度值做歸一化,如此即可求出原圖的相位角度
  9. 利用multiply函式,將第5點求出的高斯低通濾波器第6點的實數和虛數 互相做卷積,卷積完會得到新的實數和虛數,再利用merge函式,將新的實數和虛數,組成一個新的複數
  10. 利用idft函式(反傅立葉轉換函式),將第9點的複數值轉換成新的複數值,再利用split函式,將新的複數值,拆成新的實數和虛數
  11. 利用magnitude函式,將第10點的實數和虛數轉換成新的振幅值,此部分不需要將振幅值轉成對數,因為此部分所用的實數和虛數是利用idft函式求得的值。
  12. 利用normalize函式,將第11點的振幅值做歸一化,然後再將此部分求出的圖片,轉換成原圖片的尺寸,如此即可求出Gaussian Low-Pass filter處理後的,平滑圖像
  13. 印完圖像後,可讓使用者選擇是否要繼續輸入圖片欲模糊的程度,觀察同張圖片不同的模糊效果,若輸入^z,則回到第一點的流程

執行方式/畫面:

原圖:

image

灰階圖:


image

zero-padded image:


image

zero-padded image multiply by (-1)^(x+y):

image

高斯濾波器函數:

image

原圖的頻譜大小:


image

原圖的相位角度:


image

原圖與濾波器函數相乘的頻譜大小:

image

Gaussian filter(未調整為原尺寸):

image

Gaussian filter(調整為原尺寸):image

影片:

 


參考資料:

 

2022年3月13日 星期日

s1081542 作業3

作業說明:

撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)

  1. 利用 Sobel Operators 偵測並輸出邊緣成分圖
  2. 設計一個類似素描線條的自畫像圖案。

使用環境/語言:

  • Windows 11
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 利用 高斯模糊,將照片的雜訊去除。
  3. 利用 sobel operator偵測圖片邊緣。
  4. 利用 threshold 函數,將(3)的圖片的黑色部分轉成白色,白色部分轉成黑色
  5. 將(2)、(3)、(4)的圖像印出。
  6. 第一點的流程輸入0,則終止程式。

執行方式/畫面:

  • 原圖:

    image

  • 灰階圖(高斯模糊處理過):

    image

  • 邊緣偵測的圖:

    image

  • 素描圖:

    image

參考資料:

 

2022年2月26日 星期六

s1081542 作業2

 

作業說明:

撰寫一個程式,將一張圖像的整張圖像中心內切圓區域,旋轉一個角度(逆時針旋 轉 0 度至 359 度),且能利用滑動條(trackbar) 控制圖片的旋轉角度。

使用環境/語言:

  • Windows10
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 輸入欲旋轉的角度。
  3. 會輸出三種圖:原圖、整張圖像旋轉的圖、中心內切圓區域旋轉的圖
  4. 整張圖像旋轉的圖: 利用 getRotationMatrix2D 求出旋轉矩陣 , 再利用 warpAffine 將圖片旋轉
  5. 中心內切圓區域旋轉的圖: 利用每個點座標與圓心之間的距離,判斷是否屬於圓。將所有屬於圓的點座標做成一張圖(a)不屬於圓的點座標做成另外一張圖(b)。 然後圓形圖會根據輸入的角度作旋轉(c)。旋轉完後,再將(b)圖與(c)圖合併
  6. 印完圖像後,可讓使用者選擇是否要繼續輸入旋轉角度,觀察同張圖片不同旋轉角度的效果,若輸入^z,則回到第二點的流程
  7. 第一點的流程輸入0,則終止程式。

執行方式/畫面:

  • 原圖: image
  • 整張圖像旋轉的圖: image
  • 中心內切圓區域旋轉的圖: image

影片:



參考資料:

2022年2月22日 星期二

s1081542 作業1

作業說明:

  1. 撰寫一個程式讀取 1 張圖片,將圖像中每一個點像素的值各加上一個數值。
  2. 如果輸入圖像是灰階圖像,改變每個像素的灰階值。
  3. 如果輸入圖像是全彩圖像(RGB),則只改變每個像素的 R 值。
  4. 修改後的像素值仍然要介於 0 ~ 255 (注意!!數值不要溢位)
使用環境/語言:
  • Windows10
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 輸入欲增加的數值。
  3. 判斷輸入的圖片是屬於灰階圖像還是全彩圖像
  4. 若是灰階圖像,則利用輸入的數值,增加灰階圖像的每個像素的灰階值,再將原圖像灰階圖像印出。
  5. 若是全彩圖像(RGB),則利用輸入的數值,只增加全彩圖像每個像素的 R 值,再將原圖像全彩圖像印出。
  6. 印完圖像後,可讓使用者選擇是否要繼續輸入像素,觀察同張圖片不同像素的效果,若輸入^z,則回到第二點的流程
  7. 第一點的流程輸入0,則終止程式。

執行方式/畫面:

  • 輸入灰階圖:

    • 將每個像素的灰階值,加上100(像素變成255會變全白)。
    • 將每個像素的灰階值,減掉100(像素變成0會變全黑)。
  • 輸入全彩圖:

    • 將每個像素的R值,加上100。(輸入100)
    • 將每個像素的R值,減掉100。(輸入-100)
  • 影片:

參考資料: