16bit转8bit图像(Python,简单易实现)

前言

 一些工业相机采集的图像是16位的,不方便进行图像处理。比如opencv处理的常常是8位灰度图像,而深度学习模型输入图像也往往是单通道或者三通道的。因此,对16位图像做位深度转换,从而方便后续的一系列操作,是很有必要的!
 本文主要介绍用opencv+numpy实现16位图像转8位图像,做法是线性缩放

线性缩放

  • 基本原理:将16bit图像的动态范围映射到0-255
  • 公式:
    matrix_16: 16bit图像矩阵
    min: 16bit图像动态范围最小值
    max: 16bit图像动态范围最大值
    matrix_8: 8bit图像矩阵
    matrix_8=255.0∗(matrix_16 - min)/(max - min)
  • 代码实现
import cv2
import numpy as np

def transfer_16bit_to_8bit(image_path):
    image_16bit = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)
    min_16bit = np.min(image_16bit)
    max_16bit = np.max(image_16bit)
    # image_8bit = np.array(np.rint((255.0 * (image_16bit - min_16bit)) / float(max_16bit - min_16bit)), dtype=np.uint8)
    # 或者下面一种写法
    image_8bit = np.array(np.rint(255 * ((image_16bit - min_16bit) / (max_16bit - min_16bit))), dtype=np.uint8)
    print(image_16bit.dtype)
    print('16bit dynamic range: %d - %d' % (min_16bit, max_16bit))
    print(image_8bit.dtype)
    print('8bit dynamic range: %d - %d' % (np.min(image_8bit), np.max(image_8bit)))

image_path = './00003.tif'
transfer_16bit_to_8bit(image_path)
  • 关键代码块
    image_8bit = np.array(np.rint((255.0 * (image_16bit - min_16bit)) / float(max_16bit - min_16bit)), dtype=np.uint8)
    # 或者下面一种写法
    image_8bit = np.array(np.rint(255 * ((image_16bit - min_16bit) / (max_16bit - min_16bit))), dtype=np.uint8)
  • 输出结果
uint16
16bit dynamic range: 80 - 1084
uint8
8bit dynamic range: 0 - 255

扩展

 如果是使用单通道图像训练深度学习分类网络,可参考我的另一篇博客:ResNet训练单通道图像分类网络(Pytorch)

  • 18
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值