發表文章

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

s1083520 作業6

圖片
    1112 Digital Image Processing Assignment #6 主題: Run-Length Based Image Compression 練習 題目敘述 附件中為三張利用將晶片高度以色彩視覺化後的圖片。 請設計一個基於Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。 部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率 。 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 實作方法 1. 使用imread()將圖片讀入 2. 使用split()將RGB圖片的3個channel取出 3. 分別對三個channel 依照RGB的順序進行encoding      - 要注意opencv的順序是B, G, R 以免將channel資料搞混 4. 創建對應於輸入圖片的輸出檔案,將encode資料寫進檔案 Encoding方式(Run-Length) 將一樣的pixel變成(pixel, count)的形式進行,以得到壓縮的效果 但是如果整個圖片因為很複雜不夠單調的情況下,可能會使壓縮的效果不好 而這個情況可以在本次作業中的img2看出 壓縮率的計算 (1 - (compressed_size / original_size)) * 100 得到壓縮百分比 實作結果 Compression ratio

s1083520 作業5

圖片
    1112 Digital Image Processing Assignment #5 主題: 膚色偵測Skin Color Detection 題目敘述 利用你所學的 顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚 區域並將其標示出。(請用附件中的三張照片做測試) Write a program that detect skin color from an image. 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 實作方法 膚色偵測常使用的方式有2種 第一種是基於RGB的膚色偵測 第二種是YCrCb的膚色偵測 這個作業中,我選擇使用YCrCb作為基礎進行實作,並且利用Otsu法進行閥值分割 其中,Y代表亮度,Cr代表光源中的紅色分量,Cb代表光源中的藍色分量 實作步驟如下 1. 先將圖片讀入後透過cvtColor將圖片從RGB color space轉換到YCrCb color space 2. 利用split函數將轉換到YCrCb color space的圖片提取出Y、Cr以及Cb分別的圖像     此步驟主要為提取Cr的圖像 3. 利用threshold函數做Otsu自二值化閥值分割處理,得到的會是一個黑白的mask 4. 利用上個步驟得到的mask,將原圖像使用copyTo到dst得到最後的結果 實作結果 IMG_1 IMG_2 IMG_3

s1083520 作業4

圖片
    1112 Digital Image Processing Assignment #4 主題: 影像還原練習 題目敘述 附件中的image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 實作方法 將圖片進行傅立葉轉換(DFT) 觀察轉換後的矩陣其中特別亮的點 得到這些點的座標後,以這些點為中心使用circle函數將其覆蓋後,當作mask與原圖相乘 最後一部做Inverse DFT將圖片復原,即可得到降躁後的圖像 實作結果 原始圖像 將Periodic noise降低後的圖像

s1083520 作業3

圖片
  1112 Digital Image Processing Assignment #3 主題: 離散傅立葉轉換 DFT 練習 題目敘述 撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張 圖 像轉換至頻域後,將頻譜大小與相位角度各以灰階256 色圖像方式呈現出, 再呈現還 原後圖像。 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 實作方法 A. 頻譜大小與相位角度 (Forward Fourier Transform) (1) 使用FFT algorithm實作DFT以加速運算 (2) 先撰寫FFT函數提供FFT2d函數使用,以便對一張2維的圖像做DFT       FFT只做一維的FFT運算       運算完後得到一個原圖像轉換為複數的矩陣 (3) 將這個複數矩陣使用cv::split函數將複數分割成只有real part以及imaginary part的矩陣       real part表示震幅 imaginary part表示的相位 (4) 使用cv::magnitude函數將頻譜大小提取出來       為了方便觀察,通常會對其做log運算以及shift       log運算: 將原來的值+1後做log運算, M_1 = log(1 + M)       shift: 將原來從0~2pi的頻譜轉換為-pi~pi的頻譜,頻譜圖像左上及右下做交換,右上及左下做交換 (5) 使用cv::phase函數將相位角度提取出來       這邊只做shift,操作同magnitude,頻譜圖像左上及右下做交換,右上及左下做交換 (6) 將magnitude及phase使用imshow將圖片顯示 B. 還原圖像 (Inverse Fourier Transform)...

s1083520 作業2

圖片
  1112 Digital Image Processing Assignment #2 主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 題目敘述 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。 (想想:如何使用邊緣偵測所得到的點,結合成看似素描筆畫出的線條?) 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 實作方法 (a) 1. 先使用 Guassian Blur 過濾原圖像雜訊 2. 使用 Sobel 運算子對原圖像的x方向及y方向分別處理後得到gradient_x,  gradient_y 3. 將兩個分量結合得到梯度G( sqrt(gradient_x^2 + gradient_y^2) ),     通常為了加快運算,會使用abs(gradient_x) + abs(gradient_y)求得G 4. 使用addWeighted將abs_gradient_x及abs_gradient_y給定權重求和得到最終結果 (b) 將(a)得到的edge map做bitwise_not 實作結果 (a) Edge map (b) Sketch-like

s1083520 作業1

圖片
1112 Digital Image Processing Assignment #1 主題:圖像旋轉 Image Rotation 題目敘述 撰寫一個程式將一張圖像的 (a)整張圖像, (b)中心內切圓區域 旋轉一個角度(逆時針旋轉0度至359度):利用滑動條(trackbar)控制旋轉角度。 開發環境 OS: Windows 10 Editor: Visual Studio Code Compiler: GCC - 12.2.0(MinGW-W64) Language: C++ Package: OpenCV - 4.7.0 前置作業 1. 利用argv[]將圖片路徑作為參數傳入 imread() ,並宣告cv:Mat型態的變數img儲存原始圖像矩陣 。 2. cv::namedWindow(const cv::String &winname, int flags = 1) 建立視窗 。 3. cv::createTrackbar(const cv::String &trackbarname,                      const cv::String &winname,                       int *value,                       int count,                      cv::TrackbarCallback onChang =                          (cv::TrackbarCallback)0, void *userd...