以前没接触深度学习的时候没注意过图片位深度的问题,最近研究深度学习图片输入弄的也是莫名奇妙,焦头烂额。记录一下自己搜的资料的总结。首先要明白计算机的储存方式位二进制,只有0和1,因此图片的像素矩阵也不例外

这里可以看到图片的位深度为16,因此可以表示的颜色为2**16=655536

但是为什么是2的16呢,这里就是因为计算机的储存方式了。因为是从0开始所以,65535转化为二进制,1111 1111  1111 1111 每一位有两种形式0和1,因此是2**16。同理其他的位深度也是这样计算。

现在转入正题,图片转化位数组形式,目前我掌握的有两 种方式:

import cv2
import numpy as np
import skimage.io
list = np.zeros((500,500))
list[:30,50:500] = 125
cv2.imwrite('1.png',list)
# cv2.S
# print(list)
img = cv2.imread('1.png')
img2 = skimage.io.imread('1.png')
print(img.shape)
print(img2.shape)

生成一个二维数组,然后保存成图片,再用两种方式去读取看看会发生什么。

(500, 500, 3)
(500, 500)

可以看出opencv默认的读取方式就是按照三维数组后面是通道数,而skimage是按照原始的形式去读取。如果设置三维的图片呢。修改代码:

list = np.zeros((500,500,3))

输出结果:

(500, 500, 3)
(500, 500, 3)

全部都是三维了。

但是我转念一想如果是4通道呢

list = np.zeros((500,500,4))

输出结果:

(500, 500, 3)
(500, 500, 4)

opencv竟然依旧是三维的,怎么回事呢,原来opencv读取默认是rgb的方式,如果要加上通道则后面加上参数-1,0则为灰度图,没有通道数,1就是默认rgb 3通道。好了读取的方式现在明白了,那么不同位深度如何转换呢。先上一段代码,这个代码来自别人,图像处理时,我偶然发现位深度竟然改变了。

def change(img):t = img.astype(np.float32)# 减小异常值的影响maxv = np.percentile(t, 99)minv = np.percentile(t, 1)t = (t-minv)/(maxv-minv)meanv = t.mean()# 均值统一拉到0.5t += (0.5-meanv)# 扩大范围至0-65535t *= 65535t[t<0] = 0t[t>65535] = 65535img = t.astype(np.uint16)cv2.imwrite('5.png',img)

PS:在处理四通道的图片的时候我竟然又有了新的发现(我的发现为什么这么多,无知啊,知识了解的太少,各位同学记得好好学习)修改代码,

list = np.zeros((500,500,4))
list[50:100,50:100] = 255
cv2.imwrite('1.png',list)

这个代码本来应该生成一个中间有一个白色板块,其他都是黑色的图片,但是结果呢

3通道生成图片

4通道生成图片

只有一个白色的框,很明显四通道中数值为0的是透明的,因为rgba的a通道是透明通道,原来如此,竟然是透明的。

继续用change函数看下结果如何。这里需要说明一下,2维数组位深度位为8,三通道则是24,四通道则是32,为什么一开始是8这里其实我不是很明白,但是根据上面说明的,8通道总共的颜色是2**8=256 而我们熟知的rgb正好是0-255,所以应该是和计算机显示有关系,但是并不影响了,同时还涉及到图片格式,坑以后填上。在最后一个通道上的测试中我又发现了(好吧,发现了就记得,不然明天就忘记了)

我尝试读取一张彩色的图片的时候输出的像素矩阵究竟最后一位是255,那么如果把最后一位变成0对前面的有什么影响吗,(数组全是0的,图片颜色会随着最后一位通道数0-255而逐渐变深,就是最后通道数值为255的时候图片是全黑的上度娘)通过度娘的一番诉说,发现自己真的无知第四个是透明通道,数值变成255意思就是百分百不透明啊,不透明不是黑色难道不成是粉色?不过利用这一点可以用代码实现图片透明度的改变。

ist[:,:,3]=100#数组切片,索引最后一个可以理解为行数吧,但其实是维度,但是正好对应,这样也好理解,
#或者就理解成对应的通道数,0是r,1是g,2是b,3是a,把第四个通道行列全部裁剪,值变成100

a通道为0原图

a通道为100图

但是如何把一张黑图变成粉色的呢,首先我搜到了粉色的rgb值(241,204,226)

改写代码:

img = skimage.io.imread('1_255.png')
img[:,:,0]=249
img[:,:,1]=204
img[:,:,2]=226
print(img)
cv2.imwrite('fen.png',img)

出来的结果:

和想想中不太一样啊,黑的就算是变成粉色很不自然


那么到底深度是如何改变的呢:我突然想起了开头的16位深度,和代码中的数值  t *= 65535  数组中的每个数值都 * 65535,这样如果有数据,数据不都变成比65535大的数值了吗,用二进制位数表达时,位数不就改变了吗?但是要是数值是0,或者数值不为0,乘积肯定要大于 65535,这就不只是64位,但是     t[t<0] = 0 t[t>65535] = 65535这两个条件限制了范围,统统16位表示,当然了这里不是排列组合所以是,4*16=64,神奇的二进制!

由此提出两个猜想:一、位深度是数据中最大的一个数的数值的二进制长度*通道数。二、以上猜想正确。

为了验证我的猜想,我做了如下实验:全部是0,或全部和1

一维数组,位深度8  三维数组 位深度24 四维数组 位深度32

可见并不是如猜想那样,0也很神奇,二进制0的长度可以变化?还是如果没有最大值的时候,会根据维度默认补全生成?

或者是图片一个通道按照标准必须是2**8 = 256 255转化位二级制 1111 1111 如果这样,我的猜想在标准成立的条件下是成立的,现在认为猜想在每个通道初始是8的基础上成立,那么用此猜想改变下位深度试试。如果三个维度分别是16,48,64,那么此猜想可作为经验来解决改变位深度的问题。上结果

完全ok!



ps:opencv和skimage读取图片的方式其实是不一样的,opencv是按照bgr的方式读取,并且就转成rgb,用cv2保存时依旧是bga

解决方法就是用skimage去保存转换后的图片。

深度学习--------图片的位深度含义相关推荐

  1. HighNewTech:重磅!来自深度学习的三位大牛Yoshua、Hinton、LeCun荣获2018年图灵奖

    High&NewTech:来自深度学习的三位大牛Yoshua Bengio.Geoffrey Hinton.Yann LeCun荣获2018年图灵奖 导读 ACM提名 Yoshua Bengi ...

  2. 深度学习图片分类实战学习

    开始记录学习深度学习的点点滴滴 深度学习图片分类实战学习 前言 一.深度学习 二.使用步骤 1. 自建网络模型 2. 进行深度学习的学习迁移 注意事项 前言 随着人工智能的不断发展,这门技术也越来越重 ...

  3. 深度学习-图片识别(上)

    深度学习-图片识别(上) 本文主要针对优达学城深度学习课程中的练习题,整理练习内容,有兴趣者可结合本文内容然后按练习题实践,帮助理解. 任务一:下载并整理数据 任务主要完成图片下载.图片内容数字化.选 ...

  4. 【图片位深度改变】24位深度转8位深度

    代码如下: """ 2020.09.26:alian 改变图片的位深度 """ from PIL import Image import n ...

  5. 用python批量更改图片的位深度

    原因: 因为业务需要,需要进行人脸识别的照片同步功能,上传过程中遇到了个问题,就是图片的图片深度需要的是24,但是有的图片是32的,所以需要进行批量的修改,是这个位深度(如下图): 然后我们直接上代码 ...

  6. 深度学习(二)——深度学习常用术语解释, Neural Network Zoo, CNN, Autoencoder

    Dropout(续) 除了Dropout之外,还有DropConnect.两者原理上类似,后者只隐藏神经元之间的连接. 总的来说,Dropout类似于机器学习中的L1.L2规则化等增加稀疏性的算法,也 ...

  7. 什么是深度学习?怎么学好深度学习?

    [深度学习]是一种强大的多层架构,可以用于模式识别.信号检测以及分类或预测等多个领域. 深度学习在过去十年获得了极高的关注,这归功于计算能力的不断发展和训练模型不断涌现出更有效的新方法,也源于可使用的 ...

  8. 深度学习第一讲之深度学习基础

    技术交流qq群: 659201069 深度学习第一讲之深度学习基础 转载请注明出处! 本篇博文从what.why.when.who.where.how五个方面来分析深度学习,接下来讲如何入门,我门将通 ...

  9. [翻译] 神经网络与深度学习 第六章 深度学习 - Chapter 6 Deep learning

    目录: 首页 译序 关于本书 关于习题和难题 第一章 利用神经网络识别手写数字 第二章 反向传播算法是如何工作的 第三章 提升神经网络学习的效果 第四章 可视化地证明神经网络可以计算任何函数 第五章 ...

最新文章

  1. 第四课:PHP 变量
  2. 无监督分类:聚类分析(K均值)
  3. 【洛谷P5114】八月脸【边分治】【闵可夫斯基和】
  4. LoRa、LoRaWAN及网关相关技术介绍
  5. bzoj2752 高速公路
  6. Openresty+Nginx+Lua+Nginx_http_upstream_check_module 搭建
  7. Python中的两种路径
  8. 重新配对_Apple Watch配对失败的解决办法
  9. Java使用IntelliJ IDEA创建控制台程序并通过JDBC连接到数据库
  10. linux内核的自旋锁spin_lock和互斥锁mutex_lock
  11. javaScript 中的异步编程
  12. 错误解决办法:zipimport.ZipImportError: can't decompress data; zlib not available
  13. 安阳工学院ACM历史(续)
  14. robotframework-selenium2library-导入可选参数
  15. 介绍会议中控系统模块化构成及功能作用
  16. Vue - @click.prevent
  17. factory(工厂) 模式简单示例
  18. 白嫖画师原作训练Stable Diffusion引正主不满:未经同意,说用就用?
  19. 学云计算比较好的几个论坛
  20. 简信CRM:企业需要定制CRM系统的三大理由

热门文章

  1. 如何选择合适的统计学方法
  2. 【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
  3. 数据库连接10060_MySQL错误:Can't connect to MySQL server (10060)
  4. 信息安全——安全威胁
  5. 什么是软件生命周期模型?试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的使用范围。
  6. C++常用功能汇总-文件读写 计时 随机数
  7. 布局资本市场的合生创展集团,能靠“买买买”出圈吗?
  8. 【MapReduce】MapReduce读写MySQL数据
  9. 程序员应了解:知识技能金字塔
  10. js的exports