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函式庫去驗證圖片的位置,由於中文名稱的問題,程式會將使用者輸入的位置均轉為絕對位置再讀取圖片。
執行畫面:
沒有留言:
張貼留言