發表文章

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

s1071413 作業6

圖片
一、程式功能  Run-Length Based Image Compression 練習 附件中為三張利用將晶片高度以色彩視覺化後的圖片。 請設計一個基於 Run-Length 的壓縮方法,對圖檔做無失真壓縮後儲存成新檔案。部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率 (compression ratio)。 二、開發環境 •       Windows10 •       Visual Studio 2019 •       C++ •       OpenCV 4.7.0 三、程式說明 1. 於第129~131行讀取圖片原檔 2.進行 RunLength函數, 壓縮成dat檔並保存      RunLength函數:若當前的像素值=下一個像素值,則連續像素個數(count)+1。以此比對整張圖片的像素值。 並把像素質和count存入vector。 3.讀取上述RunLength後的dat檔案,解碼成圖片檔的jpg 4.計算壓縮率並顯示 四、成果展示 (1)上排:原圖、下排:壓縮後jpg檔 (2)第一排:原檔、第二排:壓縮後dat檔、第三排:建構的jpg檔 (3)個別的dat檔壓縮率

s1071413 作業5

圖片
一、作業說明 膚色偵測 Skin Color Detection 利用你所學的 顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的 皮膚區域並將其標示出。(請用附件中的三張照片做測試) Write a program that detect skin color from an image. 二、開發環境 Windows10 Visual Studio 2019 C++ OpenCV 4.7.0 三、程式說明 核心想法:僅繪出偵測到的區塊部分 在第6行讀入檔案,接著程式以以下步驟進行: 1.將圖片轉換為HSV 2.定義皮膚色彩的範圍:lowerSkinColor和upperSkinColor,根據不同圖片可能需要調整其色相、飽和度、明度的值,例如img3女性髮色和膚色較為接近,可以將upperSkinColor = cv::Scalar(20, 200, 255) 換成這樣以適應不同的皮膚色彩範圍。 3.偵測並繪製:使用inRange函數以給定的範圍創建遮罩 4. 使用了cv::morphologyEx函數 去除皮膚區域中的噪點和填補小的區域。cv::findContours函數找到皮膚區域的輪廓,並使用cv::drawContours函數繪製這些輪廓。 5.由於範例圖片長寬過大,調整輸出大小為螢幕可以容下的尺寸 最後顯示圖片 四、成果展示

s1071413 作業4

圖片
  一、作業說明 影像還原練習 附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜訊去除)。 二、開發環境 Windows10 Visual Studio 2019 C++ OpenCV 4.7.0 三、程式說明 在第8行讀取圖片檔案。程式主要分成以下階段: 1.進行傅立葉變換,並將傅立葉轉換後的頻譜中心移至圖像中心位置,便於觀察 2.使用噪聲檢測算法去檢測噪聲位置 3.設計notch filter,將六個峰值畫圓,顏色設為0 4.創建notch filter通道,同前面方法儲存實部和虛部,merge()來合併通道 5.進行逆傅立葉變換,顯示此時的圖片 四、成果展示 感想:效果並不顯著,雖然參考了網路上和其他同學的例子但我未能完全明白要點,感覺需要再研究研究。

s1071413 作業3

圖片
一、作業說明 離散傅立葉轉換 DFT 練習 撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還原後圖像。 二、開發環境 Windows10 Visual Studio 2019 C++ OpenCV 4.7.0 三、程式說明 在第9行讀取圖片檔案 15~18行: 創建Mat padded用來填充圖像。 計算圖像的最佳DFT大小,然後使用copyMakeBorder()來填充圖像,使圖像大小為2的次方以進行FFT。 19~23行: 將Mat padded轉換為複數型態,然後使用dft()進行傅立葉轉換。 接下來程式分成3個階段: Step 1.進行 DFT 轉換,並移動零頻到頻譜中心。這樣一來低頻成分就移到了頻譜的中心。得到 頻譜圖。 Step 2.將頻譜大小和相位角度轉換成 8 位灰階圖像。 得到 向位角度圖。 Step 3.進行逆傅利葉轉換,得到還原後的圖像。 最後,用imshow()顯示三個圖像。 四、成果展示 "Magnitude Spectrum"( 頻譜圖 ) "Phase Spectrum"(向位圖) "Restored Image"(還原後的圖像)

s1071413 作業2

圖片
  一、作業說明 主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。 二、開發環境 Windows10 Visual Studio 2019 C++ OpenCV 4.7.0 三、程式說明 main第29行讀入灰階圖片 【a.邊緣偵測部分】 使用openCV的Sobel函數偵測邊緣 但效果並不清晰,所以我又使用了convertScaleAbs函數調整對比度。 【b.素描效果部分】sketch函數 Canny邊緣檢測函數:尋找圖片的邊緣 dst.create & dst.setTo 函數:先創建一個空白圖像檔,setTo函數把圖像的每個像素值都設置為白色255,這是為了讓邊緣檢測到的線條能夠顯示在白色的背景上。 兩個for迴圈:檢查了圖像img的每個像素,如果在邊緣圖像edges對應的位置上檢測到了邊緣,就從輸入圖片img中取出該位置的像素值並給輸出圖像dst對應位置的像素同等的值,這樣就只有非邊緣的像素值會是白色。 四、成果展示

s1071413 作業1

圖片
  一、作業說明 撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋轉 0 度至 359 度):利用一個滑動條(trackbar)控制旋轉角度。 二、開發環境 Windows10 Visual Studio 2019 C++ OpenCV 4.7.0 三、程式說明 參數宣告 img:整張圖片    img_rotated:旋轉過的整張圖片 img_circular:中心圓區域的圖片   img_circular_rotated:旋轉過的中心圓區域的圖片。 以及兩種旋轉方法的旋轉角度,使用在滑動條函數。  funtion (a):旋轉整張圖片 首先計算圖片中心點的xy坐標,然後使用 getRotationMatrix2D 計算旋轉矩陣, warpAffine 進行旋轉,將旋轉後的圖像顯示出來。 funtion (b):旋轉中心圓部分 一樣先計算圖片中心點,然後使用circle函數畫一個圓形mask。 使用clone複製img的圖檔存到img_circular,然後使用setTo函數瞄準mask區域。 接著一樣使用getRotationMatrix2D計算旋轉矩陣、warpAffine進行旋轉。 最後用copyTo將旋轉後的mask複製到新圖像中並顯示。 main: imread讀取圖片檔。然後使用namedWindow和createTrackbar創建兩個視窗和兩個可調節的滑動條,並將它們與funtion(a)(b)聯結。 然後就可以隨便轉了。 四、成果展示 demo影片: https://drive.google.com/file/d/17869vQdh-bNeH9eORT7HMX9KfepatWZC/view?usp=sharing