發表文章

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

s1091707 作業6

圖片
  作業說明: 請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。 部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率 (compression ratio)。 執行環境: windows11 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法:     將原本圖檔的資訊,如:寬高、bgr三顏色通道的資料用run-length壓縮儲存至成                  容量較小的txt檔。 壓縮:  用shape紀錄寬高,再存進txt裡 用split分割出bgr三通道顏色向量資訊 將長寬大小的二維bgr向量flatten成一維,之後比較好計算 開始run-length,將連續同樣像素出現次數以及該像素值存進txt 程式實作方式 txt壓縮檔裡儲存的資訊 從txt檔還原成圖檔: 先將txt檔中紀錄的連續同樣像素出現次數用for迴圈遞迴,再append像素值至新的list裡 利用txt檔中的第1、2row長寬資訊,將新list reshape回二維 再用merge函式還原成圖片檔 計算壓縮率: 用os標準函式庫內建函數getsize得到檔案大小計算壓縮率,最後再三個相加除三算平均 執行結果: 三張圖及平均壓縮率: 

s1091707 作業5

圖片
   作業說明: 膚色偵測 Skin Color Detection 利用你所學的 顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚 區域並將其標示出。(請用附件中的三張照片做測試) Write a program that detect skin color from an image. 執行環境: windows11 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法: 將圖片用cvtColor函式從bgr轉為hsv,增加飽和度與明度,更能精準辨別。 定義辨別皮膚上限跟下限範圍 使用inRange函示來產生只有皮膚部分的mask 再將偵測到皮膚的部分轉為紅色 最後再與原圖合成做輸出 執行結果: (a): (b) (c): (d):

s1091707 作業4

圖片
    作業說明: 影像還原練習 附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。 執行環境: windows11 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法: 使用opencv內建函數完成 首先,用imread函式讀入圖片。 計算長高,將圖片padding to 2的次方,確保稍後傅立葉轉換的準確性。 再來,使用dft轉換前須先將影像轉成float32格式,以及使用DFT_COMPLEX_OUTPUT來設定回傳值為複數陣列,其兩個通道,一個為實數部分,一個為虛數部分 為了處理方便將原本0頻率分量從左上角移至中央。 用cv2.cartToPolar 函式來做複數到極座標的轉換函式,分別獲得 振幅和相位兩個陣列。        6.將magnitud 頻譜資訊 mag 轉換為以 dB 為單位的頻譜資訊,為了更方便地觀察和分析           頻譜           7. 用mousecallback function,將觀察到的bright spots 圖成黑點做為記號,並將xy軸存         入list中。              8.創建mask,將剛才紀錄的座標塗上圓點再與magnitude做計算,有塗點的地方改白色。                9. 進行逆傅立葉轉換前,先將零頻率分量恢復到原來的位置            10 .再進行逆傅立葉轉換          11.在進行逆傅立葉後,獲得的值仍舊是複數,需使用MAGNITUDE計算其幅度,並將            ...

s1091707 作業3

圖片
   作業說明: 撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖 像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還 原後圖像。 執行環境: windows11 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法: 使用opencv內建函數完成 首先,用imread函式並指定grayscale讀入灰階圖片。 再來,使用dft轉換前須先將影像轉成float32格式,以及使用DFT_COMPLEX_OUTPUT來設定回傳值為複數陣列,其兩個通道,一個為實數部分,一個為虛數部分 為了處理方便將原本0頻率分量從左上角移至中央。 為了顯示影像必須再計算振幅值,在此使用magnitude計算第一個參數實部與第二個參數虛部的平方和的相加的平方根。最後再將幅值對映到灰階空間[0, 255],使用公式如下: arctan2(y,x)獲得平面上點(x,y)與正x軸之間的角度。        6.正規化,用0到1之間的浮點值將矩陣變換為可視的影像格式            7. 進行逆傅立葉轉換前,先將零頻率分量恢復到原來的位置             8.再進行逆傅立葉轉換          9.在進行逆傅立葉後,獲得的值仍舊是複數,需使用MAGNITUDE計算其幅度      10.正規化,用0到1之間的浮點值將矩陣變換為可視的影像格式      執行結果: frequency spectrum: phase spectrum: 還原後的圖:

s1091707 作業2

圖片
   作業說明: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合 成看似素描筆畫出的線條?) 執行環境: windows11 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法: (A)利用 Sobel Operators 偵測並輸出邊緣成分圖: 首先,用imread函式並指定grayscale讀入灰階圖片,並使用高斯模糊函數,模糊化圖片,因為模糊化可以平滑邊緣附近的強度變化,使更容易識別圖像中的主要邊緣結構,在此我使用kernel為3*3大小。 再來,用sobel函式進行梯度計算,分別給予5種參數,'來源影像', 'dx(針對x軸抓取邊緣)',dy(針對y軸抓取邊緣),ddepth 輸出影像深度,ksize 運算區域大小,對灰階照片進行偵測邊緣的轉換。在第二個參數我將輸出圖片每個像素儲存的值設為64bit,因為Sobel函數求完導數後會有負值以及大於255的值, 而原圖像大小範圍只有0~255,如不更改會有截斷, 因此要更改數據類型, 再用convertScaleAbs先將剛才圖像中有負數的部分做絕對值,再將64bit圖像輸出為8bit圖像,因為只有當圖像為8bit,imsohw才會按原圖像數據顯示。使用此function只需要傳入剛才計算好的圖片檔。 最後將對兩軸計算後的相片做合成,在此使用addWeighted函式 (B)設計一個類似素描線條的自畫像圖案:        首先,用二值化函數將一些主要邊緣以外的淺色線條轉為黑色,讓整體圖像更清晰,在此我使用thresh_tozero,將低於閥值60的都轉為0也就是黑色。再使用thresh_trunc將線條太白的部分轉為稍淡,在此設定大於閥值150的都轉為200,讓相片更像素描畫。 最後再做黑白色反轉,在此我直接用255對矩陣圖像相減,即可達到效果 執行結果: 功能(a)成品圖: 功能(b)成品圖:

s1091707 作業1

圖片
  作業說明: 撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋 轉 0 度至 359 度):利用一個滑動條(trackbar)控制旋轉角度。 執行環境: windows10 Opencv 4.6.0 Python 3.10.2 Vscode 實作方法: (A)旋轉整張圖像: 首先,用imread,imsow函式讀入圖片及顯示圖片,以及使用shape取得本相片width,height, channel,前兩項值將用來計算中心點並存在list資料結構中留待之後使用。 再來,用createTrackbar函式分別給予5種參數,'滑桿名稱', '視窗名稱',trackbar最小值,trackbar最大值,要執行的function;再用setTrackbarPos函式分別給予3種參數,'滑桿名稱', '視窗名稱', '滑桿預設值'。 最後,定義一個rotation function被上述createTrackbar函式呼叫,parameter為要旋轉的度數。在此function中將使用getRotationMatrix2D函式分別給予3個參數,'中心點', '旋轉值', '參數縮放比例',並回傳一個2*3的transformation matrix, 再將此matrix傳進warpAffine函式進行如旋轉、仿射、平移等變換,分別給予前3種參數,'圖片名稱','transformation matrix', '輸出圖片的寬跟高'。 (B)旋轉中心圓內切區域:        首先,用imread讀入圖檔,及使用copy函數複製一張原圖留待之後合成使用,和計算本張圖片的中心點,並比較width, height兩者何者比較小,以它作為內切圓的半徑。 再來,製作mask取出圓半徑,先用numpy內建函式zeros產生height及width相同值為0的陣列,再畫出相同內切圓大小且顏色為白色外部為黑色,因為圓的部分待會要做bitwise_and白色的部分會保留圖案,黑色的部分and後會為0就不保留。 再執行如同(A)的第二跟第三步驟做旋轉。 最後把第一步先複製好的圖片中間挖一...