發表文章

目前顯示的是有「s1091541」標籤的文章

s1091541 作業6

圖片
    主題 : Run-Length Based Image Compression 練習 附件中為三張利用將晶片高度以色彩視覺化後的圖片。 請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。 部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率 (compression ratio) 。 開發環境 : windows11 Opencv 4.7.0 Visual Studio 2022 C++   程式碼說明 : 1.     將讀入的圖像通過 split() 將其分為 RGB 三個通道並使用 reshape() 分別進行降維。 2.     接著對三個通道分別進行自定義的 Run-Length Encoding 。 3.     將所有資料輸入到 txt 檔中,每個 channel 結束時輸入 e 。 4.     使用 stat() 獲取檔案信息並計算壓縮率 ( 原始檔案大小 / 壓縮後檔案大小 ) 5.     可另外撰寫 Run-Length Decoding 解壓縮檔案以確認是否成功壓縮,經過壓縮的圖像看起來應與原始圖像相同。   成果 : l    Image1:                                                                                                ...

s1091541 作業5

圖片
    主題 : 膚色偵測 Skin Color Detection 利用你所學的 顏色 (Color) 的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚 區域並將其標示出。 開發環境 : windows11 Opencv 4.7.0 Visual Studio 2022 C++   程式碼說明 : 本次作業使用了 HSV 以及 YCrCb 中 Cr 分量搭配 Otsu 閥值分割兩種方法呈現。 l    HSV: 1.     首先設定遮罩。          2.     使用 cvtColor() 將圖像轉為 HSV 色彩空間。 3.     將代表皮膚像素的範圍框在 H:0-25 、 S:40-255 和 V:50-255 。 4.     依上述範圍套上遮罩後便可呈現出結果。   l    YCrCb 中 Cr 分量搭配 Otsu 閥值分割 : 1.     使用 cvtColor() 將圖像轉為 YCrCb 色彩空間。 2.     使用 split() 分割顏色通道,並只留下其中的 Cr 通道。 3.     使用 threshold() 對 Cr 通道進行自動閥值分割作為遮罩。 4.     最後將初始圖套上遮罩便可呈現結果。   成果 : l    HSV: l    YCrCb 中 Cr 分量搭配 Otsu 閥值分割 :        

s1091541 作業4

圖片
  主題 : 影像還原練習 附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像 ( 將圖中雜 訊去除 ) 。 開發環境 : windows11 Opencv 4.7.0 Visual Studio 2022 C++ 程式碼說明 : 將接續上次作業 ( 傅立葉轉換 ) 在頻域圖上添加 notch filter 以達到去除雜訊的效果。 1.     在此次案例中需去除的地方為圖 ( 一 ) 中的六個黑點的標示處,及為圖中除了中心外峰值最高的地方。 圖 ( 一 )   2.     僅顯示峰值較高的地方可得圖 ( 二 ) 。 圖 ( 二 )     3.     透過 setMouseCallback() 中的 on_MouseHandle() 利用滑鼠動態框出需被覆蓋的地方 ( 獲取座標如 ( 圖 ( 三 )) ,完成後按下 esc 離開。 圖 ( 三 )   4.     在將這些座標傳入 notch_kernal() 函數製作 notch filter( 圖 ( 四 )) 。 圖 ( 四 )   5.     最終套入到原始頻譜圖上並使用 idft() 還原修正後的圖片再加上高斯模糊函數模糊邊界得出成果 ( 圖 ( 五 )) 。 圖 ( 五 )   成果 :

s1091541 作業3

圖片
主題 : 離散傅立葉轉換 DFT 練習 撰寫傅立葉轉換程式 (Forward Fourier Transform and Inverse Fourier Transform) 將一張圖 像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還 原後圖像。   開發環境 : l    Windows 11 l    Visual Studio 2019 C++ l    OpenCV 4.7.0 程式功能 : l    傅立葉轉換 : 1.     Padding 以及先前準備 : a.   使用 getOptimalDFTSize() 將圖片調整至最適合傅立葉轉換的大小。 b.   使用 copyMakeBorder() 將原始圖像邊緣填上 0 擴大圖像。        c.   創建 planes 矩陣陣列儲存 padding 後矩陣的實部和虛部 ( 初始化為 0) 後用 merge() 合併。     2.   使用 dft() 將複數矩陣做傅立葉轉換。 3.   使用 split() 和 magnitude() 將傅立葉轉換過後的複數值圖像換成實數值圖像。 4.   傅立葉轉換後的處理 : a.   先使用 log() 為了壓縮圖像的動態範圍並使小特徵更加明顯,又因為怕出現 log0 所以在前面加上 Scalar::all(1) 避免這類問題出現。 b.   使用 Rect() 將轉換後的圖像多餘的邊緣切除 ( 若原圖大小為奇數,在邊緣處會多一行或一列 )。        c.   接著對頻域圖像進行中心化處理,透過創建四個象限後將第一象限與第三象限交換達到鏡面效果以達到將,圖像的原點移至圖像中心。 d.   最後透過 normalize() 歸一化將相素質控制在一到零之間。   l ...

s1091541 作業2

圖片
  主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)  撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。 開發環境: windows11 Opencv 4.7.0 Visual Studio 2022 C++ 程式碼說明: (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 :  取得灰階模式圖像後,首先使用 GaussianBlur()函數進行降噪,在這裡我使用的kernal大小為3*3。                           套用Sobel函數,xdir與ydir是用於儲存Sobel濾波器應用後所產生的x與y方向的邊緣檢測結果的陣列,第四與第五個參數各代表x,y方向當x方向的參數為1則生成xdir反之亦如此。最後一個參數代表Sobel的kernal大小。 套用convertScaleAbs()函數,因為上一個步驟的結果有可能為負數,所以需要此函數除去符號以方便後續處理。 使用addWeighted()將xdir與ydir合併形成一張圖,再透過bitwise_not()將黑白反轉即可得到圖(一)。                                                                                                ...

s1091541 作業1

圖片
  Assignment #1 主題 : 圖像旋轉 (Image Rotation)      撰寫一個程式將一張圖像的 (a) 整張圖像, (b) 中心內切圓區域,旋轉一個角度 ( 逆時針旋轉 0 度至 359 度 ) :利用一個滑動條 (trackbar) 控制旋轉角度。 開發環境 : l    Windows 11 l    Visual Studio 2022 C++ l    Open CV 4.7.0 程式碼說明 : Mode 1 為旋轉整張圖像, Mode 2 為旋轉圖像中的內切圓。需輸入 1 或是 2 方可開始展示。 (a) 旋轉整張圖像 : 1.   利用 createTrackbar() 製作滑動條,設定滑動條以及視窗的名字 (angle,window) 、滑動條控制的數值範圍 (&angle( 預設為 0)~360) 跟負責完成旋轉功能的 function(rotate()) 。   2.   使用 getRotationMatrix2D() 計算旋轉二維矩陣,參數為圖像中央座標、旋轉角度及縮放比例。   3.   warpAffine() 旋轉圖片 (b) 旋轉圖像中的內切圓 : 此部分採用不同的 mask 來分別製作中心內切圓圖像與外框圖像後再進行拼湊。 1.   使用 zeros(image.size(),image.type()) 製造出一個與圖片大小相同的黑色背景 ( 圖 ( 一 )) 。         2. 使用 circle(mask, center, radius, Scalar(255, 255, 255), -1) 在黑色圖像中間畫出白色內切圓                         (radius=170) 生成遮罩 (mask)( 圖 ( 二 ))。       ...