2021年3月4日 星期四

s1071545 影像處理作業 1

 1. 作業內容:

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

2. 開發環境

        Window 10

        Anaconda

        VScode

        Python

3. 運行說明

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

4. 程式解說

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

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

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

        2)處理速度過慢:

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

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


         執行畫面:


   原圖(輸入數值為0)

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

(輸入數值為200)

(輸入數值為-200)

執行結束


沒有留言:

張貼留言