圖像處理: 如何將 像素值 控制在 值域[0, 255]

概念

在做計算機視覺方向項目的時候,往往需要進行圖像處理。但是在此過程中,常常會遇到 對 像素值 進行 變換計算 後,像素值 超出 值域區間 [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]]

效果圖



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章