概念
在做計算機視覺方向項目的時候,往往需要進行圖像處理。但是在此過程中,常常會遇到 對 像素值 進行 變換計算 後,像素值 超出 值域區間 [0, 255]
的情況。再加上計算過程中各自 float型
, int型
, uint型
的問題都跳出來作亂,在初期做圖像相關項目,深爲此苦惱。後來自己寫了一段萬能代碼模板,成功地解決了此類問題。
代碼模板
# 將 像素值 低於 值域區間[0, 255] 的 像素點 置0 pic *= (pic>0) # 將 像素值 高於 值域區間[0, 255] 的 像素點 置255 pic = pic * (pic<=255) + 255 * (pic>255) # 將 dtype 轉爲圖片的 dtype : uint8 pic = pic.astype(np.uint8)
Note:
不可 提前 進行 類型轉換(pic = pic.astype(np.uint8)
) 。因爲從 長存儲空間
轉到 短存儲空間
,會出現許多問題。從 有符號類型
轉換爲 無符號類型
,亦會出現各種 溢出 。
具體示例
代碼
import numpy as np pic = np.random.uniform(-500, 500, size=[500, 500, 1]) print pic[100:105, 100:105, 0] pic *= (pic>0) pic = pic * (pic<=255) + 255 * (pic>255) pic = pic.astype(np.uint8) print pic[100:105, 100:105, 0] import cv2 cv2.imshow('', pic) cv2.waitKey(0) cv2.destroyAllWindows()
# 處理前的 圖像像素點片段 [[ 5.89746705 -43.89719852 328.09920151 -454.31665893 267.5631818 ] [ 33.86695611 22.49668227 238.23830524 -179.06889071 -403.42761205] [ 285.50896753 -120.39818227 -426.7793327 135.06240872 -105.65909158] [ 79.93494376 -377.71028993 -351.47462962 359.15593742 -296.08087807] [ 431.2010409 421.58265706 -116.30079321 379.04589982 -450.61887501]] # 處理後的 圖像像素點片段 [[ 5 0 255 0 255] [ 33 22 238 0 0] [255 0 0 135 0] [ 79 0 0 255 0] [255 255 0 255 0]]