1.opencv的imwrite函数保存图像。输入参数必须为int类型。
当输入参数为float型时,默认会转为0-255之间,即uint8位深度,将大于255的直接截断为255.
如原始numpy数组float64类型:
imwrite后,
cv2.imwrite(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)), f1)用imread读取,
result = cv2.imread(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)),2)
print(result,result.dtype)结果:
修改:
将numpy数组f1转换为:
f1 = f1.astype("uint16")
print(f1)
需根据float的大小来确定uint16位深度,本实验uint16位深度足够存储f1数据大小。
再次imwrite,并imread,打印结果,可见数值大小没变化:
图像如下:
2. scipy.misc.imsave函数会将float数值、uint16均映射为(0-255)。
float64信息:
imsave后打印:
scipy.misc.imsave(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)), f1)
#cv2.imwrite(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)), f1)
result = cv2.imread(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)),2)
print(result,result.dtype,"ok")
从结果看图像能看清楚了:
imsave似乎对图像按照最大最小值做了线性映射0-255.
验证猜想:
#f1是二维numpy数组
f1 = f1.astype("uint16")
f1 = (f1-np.amin(f1))*255.0/(np.amax(f1)-np.amin(f1)) ###其实此处映射到0-65535也可以
f1 = f1.astype("uint8")
#scipy.misc.imsave(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)), f1)
cv2.imwrite(os.path.join(os.path.dirname(sourcefile),'adjust_'+os.path.basename(sourcefile)), f1)
查看保存的图像:
其效果和imsave函数一样,所以imsave就是线性映射。
其效果与毒霸看图、精灵看图软件效果一样.
原始图片即使看不清:
用毒霸图片查看器能看清楚:
但其功能有限,仅仅具有整体亮度提升功能。对于有亮点的图片,线性映射无法获得清晰效果。
如:
软件查看效果: