从两张图像求平均说起-python中的uint8
前段时间需要对三张图像求平均,这本来是个跟简单的问题,但是做着做着确出现了一个问题…
0. 求平均v1
import numpy as np
import cv2
data1 = cv2.imread("a.png")
data2 = cv2.imread("a.png")
cv2.imwrite("b.png",(data1+data2)/2)
其中a.png是一张全白的照片,里面全部都是255,按照我的想法,那平均一下应该还是全白,因为(255+255)/2 还是255,但是出来的结果确让我大跌眼睛,竟然变成了灰色的了,这就emm…
并且对平均后的数据输出发现全部都是127,那这是哪里出了问题呢。
后来我在网上看到别人求平均,代码如下:
import numpy as np
import cv2
data1 = cv2.imread("a.png").astype(np.float)
data2 = cv2.imread("a.png").astype(np.float)
print((data1+data2)/2)
cv2.imwrite("b.png",(data1+data2)/2)
看到这里我就有点明白了,忽然想起来了,很久之前的时候,听说过opencv读取的数据类型是uint8,到这里就大概明白了,之前的代码之所以有问题,是因为数据溢出了,uint8类型最大只能存储到256个数值[0,255],超过的部分就被截取了,因此我原先的data1+data2计算得到是510>255,所以就截断了,因此变为510%256 = 254,然后再除2就变成127了。
1. 求平均v2
因此改进后的代码如下:
import numpy as np
import cv2
data1 = cv2.imread("a.png").astype(np.float)
data2 = cv2.imread("a.png").astype(np.float)
print((data1+data2)/2)
cv2.imwrite("b.png",(data1+data2)/2)