顯示具有 #s1071545 標籤的文章。 顯示所有文章
顯示具有 #s1071545 標籤的文章。 顯示所有文章

2021年6月11日 星期五

s1071545 影像處理作業 7

作業說明:

    請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。

a.      請在部落格呈現經由數學型態學影像處理運算後的圖像,同時要呈現你程式輸出棋子數量的螢幕截圖。

b. 程式不一定可以算出正確棋子數量,越接近正確答案越好!

開發環境:

    Window 10

    Anaconda

    VScode

    Python

運行說明: 

    將路徑設定好、檔名放入 file_name 的 list 中,並用 for 依序讀取圖片並判斷黑棋個數。

    讀入的圖片先轉為灰階,再來進行二值化以及高斯模糊濾波,在進行膨脹以及侵蝕前要先設定好 kernel ,而我設定的方法如下:

    
    之後先對圖片進行膨脹,再來是侵蝕,此步驟將雜訊去除後,我計算出一個黑棋的面積,再和總面積相除就可以得到總個數。

結果畫面:

運行結果


IMG_5702.JPG 處理完的截圖


IMG_5703.JPG 處理完的截圖


IMG_5704.JPG 處理完的截圖






      

2021年6月7日 星期一

s1071545 影像處理作業 8

 作業說明:

    請寫一個程式將附圖二值化後輸出黑白圖像。目的是將文字與背景分離。

開發環境:

    Window 10

    Anaconda

    VScode

    Python

結果畫面:





2021年6月4日 星期五

s1071545 影像處理作業 6

 作業說明:

    附件中為三張利用將高度以色彩視覺化後的圖片。請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。

開發環境:

    Window 10

    Anaconda

    VScode

    Python

運行說明:

    先利用f.seek(14),因為bmp的前14格資料我們用不到,再來利用f.read(40)將標頭資訊擷取出來,再來用while將剩下的資料利用f.read(3)讀出並依據RGB存入對應的list中,讀完後利用np.array(list)將list轉換為numpy array並使用cv2.flip進行圖片的上下左右反轉。接下來使用RLE的方法先對每一列中的元素進行壓縮,再將重複的列進行合併,之後輸出成dat檔,格式為

    header:  圖片長、寬

    data: R : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]

             G : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]

             B : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]

    之後再將剛剛輸出的dat檔重新讀入,並且利用長寬資訊進行解壓縮,將還原出的檔案儲存起來。

** 假設檔案名稱為 img1.bmp,則壓縮完的檔案名稱將為img1_ecoding_output.dat,再次解壓縮的圖片檔案名稱為img1_decoding_output.bmp

平均壓縮 : (4.5713373763166294286626236833706 + 2.741916969581021618519227090109 + 4.7789263087695898632877625875292) / 3 = 4.0307268848890803034898711203363

結果畫面:

img1.bmp

(壓縮率: 14322/3133 = 4.5713373763166294286626236833706)

img2.bmp

(壓縮率: 14322/5227 = 2.741916969581021618519227090109)

img3.bmp

(壓縮率: 14322/2999 = 4.7789263087695898632877625875292)

2021年5月17日 星期一

s1071545 影像處理作業 5

 作業說明:

    附件中的讀.row晶片設計的高度檔案,設計人員無法直接看到相關資訊。利用你所學的Color顏色的知識與處理技術,撰寫一個程式來讀取附件中的讀.row 檔案,將高度資料以圖片(顏色)視覺化呈現出來,讓設計人員可以看到高度相關資訊。

開發環境:

    Window 10

    Anaconda

    VScode

    Python

運行說明:

    先利用f.read(32)將標頭資訊擷取出來,再來用while將剩下的資料利用f.read(4)讀出並存進list中,讀完後利用np.array(list)將list轉換為numpy array,讀資料時先不使用np.array而用list是因為使用list存取資料會較np.array快許多。接下來利用min、max取得最小和最大值,而-99999的這個無效值我用min去做取代,再來要轉換成圖片,即為0~255的數值,我先計算D為max - min,再將整個數值平移min,平宜能使整個數值皆為0或以上,在將每個數值去除上D並乘255,這樣就能使數值界為0~255。最後將圖片輸出並於旁邊標示colorbar。

執行畫面:

02.bmp                    02.raw      
08.bmp                    08.raw
10.bmp                    10.raw

2021年5月16日 星期日

s1071545 影像處理作業 4

作業說明:

利用你所學的Color顏色的知識與技術,撰寫一個城市來偵測一張書任照片中的皮膚區域並將其標示出

開發環境:

    Window 10

    Anaconda

    VScode

    Python

運行說明:

    先將原圖的色彩轉換為HSV並保留設定好的膚色的顏色區間內的數值,再來我使用了kernel為5*5的侵蝕(cv2.erode)及膨脹(cv2.dilate)來去除雜訊。

執行畫面:

原圖

侵蝕及膨脹處理前

侵蝕及膨脹處理後

2021年5月2日 星期日

s1071545 影像處理作業 3

作業說明:

請撰寫一個程式,讀取一張 256 色灰階圖像。

 (1)計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階 256 色圖像 方式呈現出。

 (2)對圖像利用 Gaussian Low-Pass filter 處理,輸出平滑後圖像。(程式利用課本的 frequency filter 步驟者可得滿分!)

開發環境:

    Window 10

    Anaconda

    VScode

    Python

運行說明:

    先將原圖轉換為灰階圖片,然後將長寬各擴展2倍並讓原圖保持在左上角,再來進行傅立葉轉換來求得頻譜以及相位角度,接下來求出高斯的H(D0我使用50)並與剛赴立業完的資料相乘得出G,G再反傅立葉轉換回去得到模糊後的圖。

執行畫面:


                                                                                        原圖
   

                                                                                    擴大2倍



乘上(-1) * (x + y)


相位圖


角位


H


G


處理完的結果

2021年3月25日 星期四

s1071545 影像處理作業 2

主題 : 線條自畫像

題目:

    撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可, 如全彩圖像可先將圖片由 RGB 轉換至灰階影像),利用 Sobel Operators 圖像邊緣為基 礎,設計一個類似素描線條自畫像程式。(如果可以分析邊緣偵測所得到的點,結合成 線條方式呈現更佳!)

開發環境:

    Window 10

     Anaconda

     VScode

     Python

運行說明:

    開始執行後輸入圖片的絕對位置,由於路徑可能有中文的情況,所以使用 cv2.imdecode 來讀取彩色圖片,接著使用 cv2.cvtColor 來將彩色圖片轉換為灰階圖片(第一個參數為要改變的圖片;第二是轉變的方式,而彩色轉灰階使用的是 cv2.COLOR_BGR2GRAY)。接著使用 Sobel 函數分別對X、Y方向來計算梯度,再將計算完的結果利用 cv2.bitwise_or 進行合併(參數為合併的兩個圖片,此函數為圖片的 OR)。最後使用 255 減去每一個像素之數值來達到反白的效果。

執行畫面:

原圖:


轉換為灰階後:


計算X方向梯度:


計算Y方向梯度:


X、Y梯度合併:


合併後反白:


2021年3月4日 星期四

s1071545 影像處理作業 1

 1. 作業內容:

        讀入一張圖片並輸入一個整數v,讓圖像的每一個點像素的數值加上v

2. 開發環境

        Window 10

        Anaconda

        VScode

        Python

3. 運行說明

        開始執行後輸入圖片的位置,如果是錯誤位置或非圖片檔(jpg或png)則使用者得重新輸入,再接著輸入要增加的數值(v),數值的範圍為-255~255。當輸入完數值後會跳出一個視窗並顯示處理完的圖片,若想關閉視窗,對視窗按下鍵盤的任意鍵即可。關閉視窗後能再次輸入圖片位置,想關閉系統則在輸入檔案位置時輸入”end”或”END”。

4. 程式解說

        在撰寫程式碼時,有遇到以下的問題:

        1)輸入檔案位置內含中文名稱:

如果使用cv2.imread去讀取圖片,那麼沒辦法使用包含中文名稱的位置。cv2.imdecode這個函數解決了這個問題,這函數能從指定的記憶體去讀取數據並將數據轉換為圖片。

        2)處理速度過慢:

將每一像素進行加減,很直觀的會去使用多層迴圈來處理,但這種方法在我的測試中約會跑5~7秒,所以我去尋找了能加速的方法。將圖片讀進來後,儲存格式為numpy.uint8,而我先其轉換為int32來方便後面的判斷。再來去獲取圖片的height、width、channels並創建一個與圖片相同大小的numpy array,而數值皆為使用者輸入的v。我們將圖片的陣列和剛剛創建的陣列相加並用numpy內建的索引將大於255的數值變為255、小於0的數值變為0,如果剛剛沒有轉成int32,則數值不會出現小於0或大於255的數值。最後再將圖片陣列轉回uint8。

        另外我有使用os函式庫去驗證圖片的位置,由於中文名稱的問題,程式會將使用者輸入的位置均轉為絕對位置再讀取圖片。


         執行畫面:


   原圖(輸入數值為0)

原圖(輸入數值為0、輸入位置包含中文名稱)

(輸入數值為200)

(輸入數值為-200)

執行結束