目录

1.问题背景

2.解决方法       

2.1.使用C++进行转换      

完整程序获取

2.2.使用Pyhton进行转换      

完整程序获取

3.效果查看        


1.问题背景

        简单的说,色彩深度是指每个像素可以显示的颜色数,一般是用“位”或“Bit”为单位来描述。位数越多,可用的颜色就越多,图像的色彩表现就越准确,并且图像的文件大小也会随着位深的增加而增大,因为在高位深度的图像中,每一个像素存储了更多的颜色信息。

16位图像机器学习 16位图像转8位图像_16位

        在进一步了解色彩深度之前,我们先来讨论一下什么是“位(Bit)”。我们都知道,计算机是以二进制的方式处理和存储信息的,因此任何信息进入计算机后都会变成1和0不同位数的组合,当然色彩也是如此。

16位图像机器学习 16位图像转8位图像_16位图像机器学习_02

        例如,1位的色彩深度,在计算机中只能显示0或1,所以能够展现的色彩信息只有两种白色或黑色。当我们将色彩深度提升到2位时,将出现:00、01、10、11,4(2^2)种组合方式,从而产生了相对简单的黑白灰关系。色彩深度达到3位时,将带来8(2^3)种不同的组合方式:000、001、010、011、100、101、110 和 111,黑白灰的过渡将变得更加细致。由此可见,每一次位数的增加,组合方式都会带来翻倍式的上涨。        

        如之前所说,我们需要将16位图像转换为8位图像;16位图像的像素值一共有:

65536种颜色;

        而8位位图像只有:

256种颜色,

像素值*256/65536,比如photoshop,以及matlab的im2uint8函数都是如此,在一般场景下是没有问题的,我们姑且称之为“真转换”,而如果是labelme得到的label.png标注图像在进行转换时,由于每个类别的像素值从0开始赋值,如0,1,2,3,4.......如果进行“真转换”的话,由于这些值都太小,基本转换后的像素值都是(0,1)之间,所以都变成了0,所以我们需要将16位转换位8位的时候还保留住原来的像素值,这种只改变位数,而不改变具体数值的转换方法,姑且称之为“伪转换”;

        而解决的思路也很简单,图像说白了也就是一个矩阵,像素值也就是一个数值而已,我们只需要把表示类别的像素值找出来,并且把他们的值投射到8位即可:

        使用的软件环境如下:

  • Python 3.6.3
  • VS2013
  • OPENCV 2.4.11
  • PIL
  • Labelme 2.8.0

    

2.解决方法       

2.1.使用C++进行转换      

完整代码,批量转换,速度最快,需要配置opencv):

完整程序获取

16位转8位图像-C++:

        链接:https://pan.baidu.com/s/1Wqh8AvcDBovwlI7NvfT9fw?pwd=146l 提取码:146l,下载后打开“微信支付.png”使用微信扫码支付:

16位图像机器学习 16位图像转8位图像_maskrcnn_03

       获取压缩包密码:

               付款后微信留言购买的资源名称(上方橙色文字),博主会微信回复你解压密码(推荐,不需要加好友):

                        

16位图像机器学习 16位图像转8位图像_图像转换_04

 → 

16位图像机器学习 16位图像转8位图像_maskrcnn_05

 → 

16位图像机器学习 16位图像转8位图像_labelme_06

               

2.2.使用Pyhton进行转换      

完整代码,推荐,批量转化,速度也很快,但是少了配置opencv的麻烦):

完整程序获取

16位转8位图像-Python:

        链接:https://pan.baidu.com/s/1J3Np5-tPSPaBTuKP2gtjLQ?pwd=m05k 提取码:m05k

注意:不要直接点击,右键复制网址后用浏览器打开!!!

下载后打开“微信支付.png”使用微信扫码支付:

16位图像机器学习 16位图像转8位图像_maskrcnn_03

       获取压缩包密码:

               付款后微信留言购买的资源名称(上方橙色文字),博主会微信回复你解压密码(推荐,不需要加好友):

                        

16位图像机器学习 16位图像转8位图像_图像转换_04

 → 

16位图像机器学习 16位图像转8位图像_maskrcnn_05

 → 

16位图像机器学习 16位图像转8位图像_labelme_06

               

注意:由于虚拟软件的可复制性,一旦售出,便会产生多个副本,因此概不退款,谢谢合作!

3.效果查看        

        转换完成后,可以使用软件查看时候变为8位:

16位图像机器学习 16位图像转8位图像_labelme_11

         但是打开图片是一片黑:

16位图像机器学习 16位图像转8位图像_图像转换_12

        这是因为图片的每个像素值之间差异不大,如果需要直观的看到明显的变化,提高类别之间的差异性,可以直接乘以一个较大的值,如20:

img = Image.fromarray(np.uint8(img)*20)

        保存之后再打印,可以看到已经可以看到明显的差异了:

16位图像机器学习 16位图像转8位图像_labelme_13