發表文章

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

s1081540 作業 6

圖片
主題:Run-Length Based Image Compression 練習 作業說明 附件中為三張利用將晶片高度以色彩視覺化後的圖片。 請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。 部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率(compression ratio)。 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ 程式實作 使用  imread()  讀入附件中的圖像,再使用  empty()  判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。  split()  :將彩色圖像拆分為3個單一通道(B、G、R)。 分別對3個單一通道(B、G、R)進行Run-Length編碼壓縮。 Run-Length Encoding:將連續重複的資料改以兩個部份來表示,第一個byte代表顏色(0~255),第二個byte代表該顏色連續出現的次數。 將壓縮後的資料寫入txt文字檔。 txt文字檔的內容包含:影像的列數、影像的行數、B通道的壓縮資料、G通道的壓縮資料、R通道的壓縮資料。  imshow()  :顯示原圖及經過膚色檢測後的圖像。 計算壓縮率。 資料壓縮比 = 壓縮前的資料量大小 / 壓縮後的資料量大小。 輸出影像的列數、影像的行數、原來的檔案大小、壓縮後的檔案大小、壓縮率。  waitKey(0)  :透過使用者輸入0來中止程式。 執行結果 img1 ▲ img1圖像及原始檔案大小 ▲ 將img1壓縮後的文字檔部分內容及 壓縮後的檔案大小 ▲ 輸出結果 img2 ▲ img2圖像及原始檔案大小 ▲ 將img2壓縮後的文字檔部分內容及 壓縮後的檔案大小 ▲ 輸出結果 img3 ▲ img3圖像及原始檔案大小 ▲ 將img3壓縮後的文字檔部分內容及 壓縮後的檔案大小 ▲ 輸出結果 壓縮率 img1壓縮率 = 2.070107752429847 img2壓縮率 = 1.213333514247755 img3壓縮率 = 2.239885522678505 平均壓縮率 = ( 2.070107752429847 + 1.21333351424775...

s1081540 作業 5

圖片
主題:膚色偵測 Skin Color Detection 作業說明 利用你所學的顏色(Color)的知識與技術,撰寫一個程式來偵測一張輸入照片中的皮膚區域並將其標示出。(請用附件中的三張照片做測試) Write a program that detect skin color from an image. 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ 程式實作 使用  imread()  讀入附件中的三張圖像,再使用  empty()  判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。  cvtColor()  :對原圖進行顏色空間轉換(BGR→BGRA、BGR→HSV、BGR→YCrCb)。  at()  :讀取轉換成BGRA、HSV、YCrCb類型的圖像像素值。 根據參考文獻定義的膚色範圍找出符合條件的膚色像素點,並將這些符合條件的像素點設為白色/原來的顏色,而不符合條件的像素點設為黑色。以下為參考文獻定義的兩種膚色範圍: 0.0 <= H <= 50.0 and 0.23 <= S <= 0.68 and R > 95 and G > 40 and B > 20 and R > G and R > B and | R - G | > 15 and A > 15 R > 95 and G > 40 and B > 20 and R > G and R > B and | R - G | > 15 and A > 15 and Cr > 135 and Cb > 85 and Y > 80 and Cr <= (1.5862*Cb)+20 and Cr>=(0.3448*Cb)+76.2069 and Cr >= (-4.5652*Cb)+234.5652 and Cr <= (-1.15*Cb)+301.75 and Cr <= (-2.2857*Cb)+432.85  imshow()  :顯示原圖及經過膚色檢測後的圖像。  wait...

s1081540 作業 4

圖片
主題:影像還原練習 作業說明 附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜訊去除)。 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ MATLAB 程式實作 使用  imread(path, IMREAD_GRAYSCALE)  以灰階模式讀入圖像,再使用  empty()  判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。  Rect()  :使原圖像保證有偶數的行與列。 分析輸入圖像的頻譜後,可以看到頻譜中心外有6個峰值: ▲ 原圖像的 頻譜大小 使用MATLAB找出較正確的頻譜峰值座標。  imread()  :讀入頻譜大小圖像。  meshc()  :繪製三維的圖像,顯示灰度值的大小。  view()  :將三維圖像改變觀測角度以便查找峰值的座標。 設計notch filter  circle()  :以3個峰值點座標為中心,畫出圓形(加上對稱點一共6個圓點),並將圓點的值設為0。 對圖像象限進行重新排列,使原點位於圖像中心。 將圖像分成4個象限。  copyTo()  :交換象限(左上與右下進行交換、右上與左下進行交換)。 ▲  設計完成的notch filter 創建原圖像的圖像通道,用來儲存複數的實部與虛部,並使用  merge()  來合併圖像通道。  dft()  :對原圖像進行離散傅立葉轉換(DFT) 創建notch filter的圖像通道,用來儲存複數的實部與虛部,並使用  merge()  來合併圖像通道。  mulSpectrums()  :將兩個(原圖像及notch filter)傅立葉頻譜中的每個element進行相乘。 ▲  經過notch filter的頻譜  idft()  :將經過notch filter的頻譜進行IDFT(重建圖像)。  split()  :分離圖像通道。  normalize()  :歸一化...

s1081540 作業 3

圖片
主題:離散傅立葉轉換 DFT 練習 作業說明 撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還原後圖像。 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ 程式實作 使用  imread(path, IMREAD_GRAYSCALE)  以灰階模式讀入圖像,再使用  empty()  判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。  getOptimalDFTSize()  :獲得圖像的最佳尺寸大小(2的次方),如果在最佳尺寸的圖像上執行DFT可以更快地執行。  copyMakeBorder()  :在圖像邊緣補0值。 創建圖像通道,儲存DFT後的實部與虛部。  dft()  :進行離散傅立葉轉換(DFT)。  split()  :分離圖像通道,planes[0]為實數部分,planes[1]為虛數部分。  magnitude()  :將複數轉換爲magnitude(DFT的結果是複數)。  phase()  :取得相位圖。  log()  :因為magnitude的值範圍太大,所以換成對數的刻度(logarithmic scale),方便顯示結果。 使spectrum保證有偶數的行與列。 對DFT後的圖像象限進行重新排列,使原點位於圖像中心。  normalize()  :歸一化,將圖像(magnitude、phase)轉換到可顯示範圍(0~1)。  imshow()  :顯示頻譜大小、相位角度圖像。  idft()  :進行IDFT(重建圖像)。  normalize()  :歸一化,將圖像(IDFT)轉換到可顯示範圍(0~1)。  imshow()  :顯示還原後圖像,若圖像出現黑色邊界是  copyMakeBorder()  的0值...

s1081540 作業 2

圖片
主題:線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection) 作業說明 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a) 利用Sobel Operators 偵測並輸出邊緣成分圖 (b) 設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合成看似素描筆畫出的線條?) 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ 程式實作 使用  imread(path, IMREAD_GRAYSCALE)  以灰階模式讀入圖像,再使用  empty()  判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。 ▲  Grayscale image (a) 產生邊緣成分圖  Sobel()  :分別計算圖像的x方向、y方向梯度   convertScaleAbs()  :分別計算圖像x方向、y方向梯度的絕對值,將圖像轉換回原來的uint8形式(CV_8U),否則將無法顯示圖像,只會顯示灰色的視窗   addWeighted()  :因為  Sobel()  是計算兩個方向的梯度,因此要使用此函數將兩個梯度以設定的權重相叠加   imshow()  :顯示目標圖像(邊緣成分圖) (b) 產生類似素描線條的自畫像圖案   addWeighted()  :透過255减去原始像素來進行反色操作 ▲  Reverse color   GaussianBlur()  :使用高斯濾波將影像模糊化並消除噪聲 ▲  Reverse color + Gaussian filter 將圖像疊加並把顏色減淡   imshow()  :顯示目標圖像(素描線條圖)  waitKey(0)  :透過使用者輸入0來中止程式 執行結果 (a) 邊緣成分圖 (b) 素描線條圖 ▲  程式執行過程 參考資料: Sobel Derivatives - OpenCV Docume...

s1081540 作業 1

圖片
主題:圖像旋轉 (Image Rotation) 作業說明 撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋轉 0 度至 359 度):利用一個滑動條(trackbar)控制旋轉角度。 開發環境 Windows 10 OpenCV 4.2.0 Visual Studio 2019 C++ 程式實作 使用 imread() 讀入圖像,再使用 empty() 判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。 由使用者選擇圖像旋轉方式 輸入 a:旋轉整張圖像 輸入 b:旋轉圖像中心內切圓區域 輸入其他:結束程式 選擇旋轉整張圖像 namedWindow() :創建Rotated image視窗 createTrackbar() :創建 Trackbar getRotationMatrix2D() :產生旋轉指定角度影像的仿射矩陣 warpAffine() :將來源的圖像,根據前面產生的仿射矩陣,獲得仿射轉換後的新圖像 imshow() :顯示目標圖像 選擇旋轉圖像中心內切圓區域 namedWindow() :創建Rotated CR image視窗 createTrackbar() :創建 Trackbar 將圖像進行圓形切割:創建兩個全黑圖像(image1和image2),在源圖像中畫一個圓,利用for迴圈尋訪每個點,判斷該點是否在圓內,如果是就將該點的資料複製到image1,如果否就將該點的資料複製到image2,最終得到image1為切割成圓形的圖像,而image2為圓形外圍的圖像 getRotationMatrix2D() :產生旋轉指定角度影像的仿射矩陣 warpAffine() :將來源的圖像,根據前面產生的仿射矩陣,獲得仿射轉換後的新圖像 bitwise_or() :將兩張圖片(前面獲得的圖像、image2)做聯集 imshow() :顯示目標圖像 waitKey(0) :透過使用者輸入0來中止程式 執行結果 (a)旋轉整張圖像 (b)旋轉圖像中心內切圓區域 ▲    程式執行過程 參考資料: Adding a Trackbar to our applications! - OpenCV: https://docs.opencv.org/3.4/da/d6a/tutorial_trackbar....