在做计算机视觉方向项目的时候,往往需要进行图像处理。但是在此过程中,常常会遇到 对 像素值 进行 变换计算 后,像素值 超出 值域区间 [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)
不可 提前 进行 类型转换(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]]