opencv imwrite函数和scipy.misc.imsave函数注意事项

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就是线性映射。 

其效果与毒霸看图、精灵看图软件效果一样.

原始图片即使看不清:

用毒霸图片查看器能看清楚:

 但其功能有限,仅仅具有整体亮度提升功能。对于有亮点的图片,线性映射无法获得清晰效果。

如:

软件查看效果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值