發表文章

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

s1093705 作業6

圖片
  Run-Length Based Image Compression 練習 題目說明: 附件中為三張利用將晶片高度以色彩視覺化後的圖片。 請設計一個基於Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。 部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率 (compression ratio)。 開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: Run length format: [0, 0, 0, 128, 255, 255] -> 0 3 128 1 255 2 程式說明: 1. Import  library from PIL import Image import numpy as np import os 2. run-length encoding algorithm def RLE_encoding ( img , bits = 8 ):     encoded = []     count = 0     prev = None     fimg = img .flatten()         for pixel in fimg :         if prev == None :             prev = pixel             count += 1         else :             if prev != pixel :                 encoded . append (( count , prev ...

s1093705 作業5

圖片
  膚色偵測Skin Color Detection 題目說明: 利用你所學的 顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚 區域並將其標示出。(請用附件中的三張照片做測試) 開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: 程式說明: A. HSV色域 1.把GBR圖像轉換至HSV色域。 img_HSV = cv2 . cvtColor ( image , cv2 . COLOR_BGR2HSV ) 2.設定遮罩,只通過皮膚的HSV色域範圍  H:0~17 S :15~170 V :0~255 HSV_mask = cv2 . inRange ( img_HSV , ( 0 , 15 , 0 ), ( 17 , 170 , 255 )) HSV_mask = cv2 . morphologyEx ( HSV_mask , cv2 . MORPH_OPEN , np . ones (( 3 , 3 ), np . uint8 )) B. YCrCb色域 1.  把GBR圖像轉換至YCrCb色域。 img_HSV = cv2 . cvtColor ( image , cv2 . COLOR_BGR2HSV ) 2.設定遮罩,只通過皮膚的HSV色域範圍  Y :0~255 Cr :135~180 Cb :85~135 YCrCb_mask = cv2 . inRange ( img_YCrCb , ( 0 , 135 , 85 ), ( 255 , 180 , 135 )) YCrCb_mask = cv2 . morphologyEx ( YCrCb_mask , cv2 . MORPH_OPEN , np . ones (( 3 , 3 ), np . uint8 )) C. HSV色域 + YCrCb色域 1.將A、B兩者的遮罩混和,取兩 者的優點,形成更強化的膚色偵測功能。 global_mask = cv2 . bitwise_and ( YCrCb_mask , HSV_mask ) global_mask = cv2 . medianBlur...

s1093705 作業4

圖片
影像還原練習 題目說明: 附件中的image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。 開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: 程式說明: 自訂函式說明: def notch_filter_circle(shape, radius, column, row): 給定半徑、圓心座標,畫出一個的圓、 以及對稱於照片中心的另一個圓形,當作 notch filter 的屏蔽區域 。 def notch_filter_rectangle(shape, start_col, start_row, end_col, end_row): 給定長方形 的其中兩個對稱點座標,畫出 出一個 長方形 、 以及對稱於照片中心的另一個 長方形。 實作步驟: 1. 讀取圖片 img = cv2.imread(): 2. 計算圖片的傅立葉轉換,算出團片的頻譜 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) magnitude_spectrum = np.log(np.abs(fshift)) 3. 算出 notch_filter C1 = notch_filter_circle(img_shape, radius, 790, 447) C2 = notch_filter_circle(img_shape, radius, 805, 416) C3 = notch_filter_circle(img_shape, radius, 795, 383) R1 = notch_filter_rectangle(img_shape, 790, 0, 810, 370) R2 = notch_filter_rectangle(img_shape, 1495, 0, 1515, 960) NotchFilter = C1*C2*C3*R1*R2 4. 算出 notched_spectrum NotchRejectCenter = fshift * NotchFilter NotchReject = np.fft.ifftshift(NotchRejectCenter) inverse_NotchR...

s1093705 作業3

圖片
 離散傅立葉轉換 DFT 練習 題目說明: 撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖 像轉換至頻域後,將頻譜大小與相位角度各以灰階256 色圖像方式呈現出,再呈現還 原後圖像。 開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: 程式說明: 此次作業使用cv2, numpy, matplotlib 三個程式庫,分別使用於:影像處理、處理矩陣運算、繪製影像 import cv2 import numpy as np from matplotlib import pyplot as plt 圖取照片 img = cv2 . imread ( "image3.png" , 0 ) 進行傅立葉轉換,在 numpy 程式庫裡面 fft 套件有 fft2()  函數可以使用, 提供二維的傅立葉轉換。 f = np . fft . fft2 ( img ) 二維傅立葉轉換之後, zero frequency component  (零頻率) 會位於左上角,用 np.fft.fftshift(),讓兩個維度各自位移   ,方便我們觀察頻譜分布狀況。 fshift = np . fft . fftshift ( f ) magnitude_spectrum_shift = np . log ( np . abs ( fshift )) 用 np.angle() 取得照片的相位角。 phase_angle = np . angle ( f ) 用 np.fft.ifft2() 做反傅立葉轉換。  combined = np . multiply ( np . abs ( f ), np . exp ( 1 j * phase_angle )) img_combined = np . real ( np . fft . ifft2 ( combined )) 參考資料: How to combine the phase of one image and magnitude of d...

s1093705 作業二

圖片
線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 題目說明: 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)      (a)利用Sobel Operators 偵測並輸出邊緣成分圖      (b)設計一個類似素描線條的自畫像圖案。 開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: Sobel Operators 偵測邊緣圖 邊緣圖轉換成素描風格圖 不同技術轉換成出的素描風格圖 實作Demo: 程式說明: 本題利用 cv2.createTrackbar() 和 cv2.getTrackbarPos() 來控制以下變數,來尋找邊緣偵測的最佳參數: A:  用  cv2.threadhold() , 將圖形顏色較淡的地方,去除小於A 的值,A 以上的值維持不變。 B:用高斯分佈進行模糊化的計算,指定模糊區域單位 BxB。 C:用  cv2.threadhold()  ,去除小於 C 的值,C 以上的值維持不變,以達到 加強邊緣線的效果。 D: (a)利用Sobel Operators 偵測並輸出邊緣成分圖 1. 先將圖形顏色較淡的地方,用  cv2.threadhold() 去除,此例是去除小於A 的值,A 以上的值維持不變, 參數介紹: ( Reference ) v2.THRESH_BINARY 如果大於 A 就等於 255,反之等於 0。 cv2.THRESH_BINARY_INV 如果大於 A 就等於 0,反之等於 255。 cv2.THRESH_TRUNC 如果大於 A 就等於 127,反之數值不變。 cv2.THRESH_TOZERO 如果大於 A 數值不變,反之數值等於 0。 cv2.THRESH_TOZERO_INV 如果大於 A 等於 0,反之數值不變。     ret , image = cv2 . threshold ( image , A , 255, cv2 . THRESH...

s1093705 作業1

圖片
圖像旋轉(Image Rotation) 題目說明: 撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋轉0 度至359 度):利用一個滑動條(trackbar)控制旋轉角度。  開發環境: Windows 11  Visual Studio Code Python 3.11.2  Opencv 4.7.0 實作結果: 程式說明: 首先在 terminal 輸入以下指令,來安裝 openCV 的電腦視覺庫。 pip install opencv-python 引入 OpenCV 的函式庫: import cv2 讀取路徑中的照片: image_all = cv2 . imread ( path ) (a) 旋轉整張圖像: 用 createTrackerbar 建立拖拉工具,讓使用者可以控制旋轉的角度: cv2 . createTrackbar ( bar_name , window_name_1 , bar_beg , bar_end , rotate_all ) 使用者控制旋轉角度後,將照片旋轉,並且更新顯示的影像; getTrackerPos: 取得使用者輸入的值。 getRotationMatrix2D: 可以產生旋轉指定角度影像的仿射矩陣。 warpAffine: 利用旋轉矩陣產生旋轉後的影像。 imshow: 顯示影像在新的視窗。 def rotate_all ( value ):     degree = cv2 . getTrackbarPos ( bar_name , window_name_1 )     rotation_matrix = cv2 . getRotationMatrix2D (( width / 2 , height / 2 ), degree , 1 )     rotated_image = cv2 . warpAffine ( image_all , rotation_matrix , ( width , height ))     cv2 . imshow ( window_name_1 , rotated_image ) (b) 旋轉中心內切圓圖像: 建立...