开发者学堂课程【计算机视觉入门及案例实战:图像学基础】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/744/detail/13171
图像学基础
内容简介:
一、图像学
二、计算机中彩色图片的一个的像素点是怎么表示的?
三、计算机中彩色图片怎样表示的?
四、计算机中的灰色图片怎样表示的,为什么要使用灰色图片?
五、习题
一、图像学
1.图像学就是研究怎么样用数字去表示看到的一切的学科.
2.图像学学习的三个方面
①彩色图片怎样通过数字表示的?
②什么是灰度图像?灰度图像有何作用?
③opencv 库安装与简单使用
二、计算机中彩色图片的一个的像素点是怎么表示的?
使用3个(0-255)之间数字表示在RGB(红,绿,蓝)三个不同通道颜色的强度,来呈现不同的颜色。
具体解析:
一张彩色的图片在计算机中,由许多像素点组成,每个像素点都有一个特定的颜色,如何表示这个特定的颜色,先给大家介绍一个概念 RGB
从一张图片谈起:
左边是一张企鹅的高清图,右边是它局部区域放大的效果。画出局部区域可以很清晰的看到,当把局部区域放大之后,它变得模糊了,但如果把局部区域缩小,它还是非常清晰的。再看到局部区域,我们可以发现它其实是有很多的点点去组成的,这些点的名字叫像素点。点其实是一个一个的小方块,并且每个小方块属于一个特别的颜色,并且一个小方块它是不可能属于两个不同的颜色的。如果这张图它的宽度是100,长度是100。可以算出这张图由1万个像素组成,可以想象,假如像素特别多,就能够去描述一张非常高清的图片。至此可以通过这样一张图,得出一个结论。计算机中,无论是高清的图片,还是不那么清晰的图片,都是由一个一个的像素点去组成的,每个像素点它只能呈现一个特定的颜色,是图像表示的最小单元,单位面积内的像素点越多,它所能表示的图片也会越清晰
1.三原色光模式(RGB)
三原色光模式(RGB),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以合成产生各种色彩光相加色混合的表现。原色光投射到屏幕上,在相互重叠的地方显示出新的颜色:红色、绿色和蓝色以适当的强度组合可以产生白色。
2.选择红绿蓝的生理原因(了解即可)
三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,到的刺激略大于辨别绿色的细胞,人的感觉是黄色:如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这种光可以分别对三种追星细胞产生刺激。
注意:RGB中光的强度,我们从0到1一次划分强度。并且每一列RGB我们一般称为通道
3.计算机中的显示模式:24比特模式
24比特模式是指每像素24位比特编码的RGB值:使用三个8位无符号整数(0到255)表示红色、绿色和蓝色的强度。这是当前主流的标准表示方法,它可以产生一千六百万种颜色组合,对人类的眼睛来说,其中有许多颜色已经是无法确切的分辨。
下面举例说明:
计算机中的显示模式有很多种,用的最多的是24比特模式,就是用24位2进制的数据来表示RGB。以下面的第二个例子进行说明,一个24位二进制数据,数字全部都是1,由于要用24位二进制的数字来表示RGB三个通道上不同的强弱程度,因此分到每条通道上面,实际上就是8位,代表了在RGB三个通道上面的强弱程度。做一个近似的转换,把二进制转化为10进制那8位二进制的1是2的8次方-1=256-1=255,他们对应的颜色就是白色。下面是相关的例子:
三、计算机中彩色图片怎样表示的?
用一个三位的数组或者说列表就可以简单的表示出计算机中的彩色图片
解析:
Opencv 中的颜色表示是倒过来的RGB,也就是 BGR:蓝色、绿色、红色
如何去表示一张猫图?
一张猫图是由很多的像素点组成的,每个像素点是使用一个 RGB 三个通道的数值来表示的。这些像素点是怎样排列组合去形成这张猫图的,接下来逐步说明。
首先,从像素点开始讲解,一个红色的像素点,为了演示方便将它放大,用RGB表示为,在红色R通道上是255,绿色G通道数值是0,在蓝色B通道上数值也是0。(255,0,0)数据结构称为元组,而[255,0,0]数据结构被称为列组。两种结构表示的都是有顺序的数据的集合,两种表达形式在效果上是一致的。在之后的案例中,会大量的使用到一个第3方的计算机视觉库openCV。opencv的世界里面,三通道的顺序并不是RGB,而是倒过来写的RGB。一个红色的像素点则表示为[0,0,255],之后为避免混淆,都将使用opencv中的表达的数据结构,就是BGR。
其次由点及线,一条像素线如何表示呢?短线中间画一根虚线。第1个点,写成openCV中的表达方式,它的顺序实际上是倒过来写的RGB,在红色这个通道上是255,在绿色这个通道上是0,在蓝色这个通道上也是0。表示为[0,0,255]。另个点也是一样,表示为[0,0,255]。之前已经了解到列表是能够表征顺序的,其实列表还能够嵌套,所以接下来只要在最外层套上这样一个中括号,然后注意记得用逗号隔开就可以表示为两个像素点组成的像素线了。总结:一个长为两个像素点的红线在opencv的世界里面,是用列表去嵌套列表组成的最外层的这样一个列表,它就代表着线而里面的这个一个一个的小的列表,它代表的就是一个一个的点,所以实际上是用点连在一起去组成了。最后由线及面,一条红色短线,一条蓝色短线,一条绿色短线组成一个像素面。前面已经学会了如何使用数字和符号来表示一根线,这里还是使用 opencv,先把这条红线发出来,为[[0,0,255],[0,0,255]],
接下来是绿色的线[[0,255,0],[0,255,0]]和蓝色的线[[255,0,0],[255,0,0]]。目的就是要把三条线组合在一起变成一个面,可以发现这三条线是有一个顺序的,记得之前是怎么样通过点组成线的吗?直接在外层套一个中括号,把它放在一个列表里面就可以了。相应的只要把这三条线也套一个中括号,把它放到一个列表里面就可以了。注意用逗号隔开。表示为:
[
[[0,0,255],[0,0,255]]
[[0,255,0],[0,255,0]]
[[255,0,0],[255,0,0]]
]
这就能够表示一张3×2的图片,其中最底层的中括号,它代表的是像素点,这个表示着像素点,实际上是RGB三通道,中间层的中括号它代表的是线,线里面有两个像素点,它代表的是图片,宽度是按最外层的中括号它代表的面中括号里面元素的个数上去代表着图片。案例:用两个像素点去表示一条线,例如两个红色的像素点表示一条线
1.案例:使用opencv写入效果如下的图片
(1)代码
安装第三方包 opencv
Pipinsta11opencv-python
解析:输入opencv安装包后,可以直接回车进行安装。但如果需要下载和安装的速度更快,也可以通过-i的选项去指定一个国内的镜像元,因为这个命令它默认使用的是国外的网址,通过杠I的选项,指定使用一个国内的镜像元,就可以更快的加载了。老师使用了豆瓣的镜像元:https://pypi.douban.com/simple
(2)敲代码 code
Importnumpyasnp
Importcv2
Image_array=np.array([
[[0,0,255],[0,0,255]],
[[0,255,0],[0,255,0]],
[[255,0,0],[255,0,0]]
])cv2.imwrite(‘images/demo3×2.png’,image_array)
解析:导入已经安装好的 opencv的库,注意导入的时候不是写open
CV而是importerCV处。接下来正式编写代码实现案例,我们分为
三个步骤,第1个实力化列表,实例化图片,代表图片的列表数据。
把表数据写入到一个文件中,但注意opencv的库不能够直接写入列
表,先把数据转换成line中的一个数组。第2步是把列表数据转换
为line中的数组,转换好的数据写入到特定的文件中。把列表转换
成numpy中的数组对象,然后把列表对象放进去。方法呈现两个参数,
第1个是文件名,第2个是数组对象,接下来要定义文件名,新建一
个文件夹,把生成的文件放到文件夹下。再来编写一个文件名,文件
名就是images。看到图片效果,和案例效果相同。
2.案例:使用opencv读取刚刚写入的图片,查看像素内容,查看形
状或者说维度信息
(1)代码:
Importcv2
Image_file_name=’images/demo3×2.png’
Src=cv2.imread(image_file_name)
Print(src)
Print(src.shape)#(3,2,3)
(2)解析:
先导入已经安装好的 openCV 的库,使用 openCV 读取刚刚写入的图片,查看像素内容,查看形状或者是维度信息。第1步读取图片。OpenCV 库读取信息、查看像素内、。查看维度信息。然后需要使用一个变量来承接读取的报道文件src。接下来就来看这样一个图片的像素内容,直接通过 printsrc 就能看到它的像素内容,然后查看维度信息,维度信息是藏在 src 的 shaper 属性中 createsrc 点 shaper
四、计算机中的灰色图片怎样表示的,为什么要使用灰色图片?
回答:计算机中的灰度图像是二维数组表示的,灰度图像起到了降维的作用,方便计算机快速处理
思考1:下面这张图片还是彩色图片吗?还需要用RGB三个通道来表示?
不是彩色的RGB图片,而是灰度图像,感觉不需要用RGB三个通道来表示,使用三个通道来表示有点浪费。
思考2:上面的图片你还能认出来是猫吗?感觉失真大不大?用手机的照片编辑软件就能把左边这样一张彩色的图转化为右边,这样一张灰色的图,显然还能认出右边这样一张图是猫图,感觉失真并不大,但是还是丢失了一些关键的信息,比如说它的颜色,实际上右边这张图它是一张灰度图。
总结:能认出来是猫,有些失真(不知道是黄颜色的猫),但感觉失真不大(能认出来是猫,知道他在舔舌头)
1.案例:彩色图像(RGB)转灰度(GRAY)图像
要求:把彩色图像转换为灰度图像,并看看灰度图像在计算机中又是怎样表示的。
选中一张彩色的猫图,在这里将使用一款新的ID工具spider,大家可以使用原来的工具,使用spider的目的是为了给大家更好的演示程序。新建一个模块的文件取名denmo.03cat.True,great.打开这样一个文件,接下来来编写代码。
代码:
(1)读取彩色图片
Rgb_cat=cv2.imread(“images/cat.png”)
(2)把彩色图片转换为灰度图片
Gray_cat=cv2.cvtColor(rgb_cat,cv2.COLOR_BGR2GRAY)
(3)查看灰度图像的像素内容
Print(gray_cat)
(4)查看灰度图片的维度信息
Print(gray_cat.sgape)
(5)保存灰度图像
Cv2.imwrite(“images/cat_gray.png”,gray_cat)
解析:
导入之前已经安装好的openCV的包。
首先读取彩色猫图。点击开始目录下面的catch点PNG,把彩色图片转换为灰度图片,一行代码就可以把彩色猫图转换为灰度图片,第1个参数是原图,第2个参数是把原图像转换为什么类型的图片。把变量替换一下,选择转为灰度图片。使用变量承接转换之后的结果,然后代码查看灰度图像的像素内容,直接通过print打印出来。查看一下它的维度信息。然后通过变量管理器,看到相应的信息。接下来保存这张灰度图像,需要两个参数,第1个是要把它写到哪个文件中,
第2个是要把哪个图片写到这个文件名对应的文件中。先写文件名,文件名是images上面的catgreen。把这张灰度图片写到这个文件内容中。代码输入完成。
思考3:灰度图片有什么用?
起到降维的作用,把一个像素点的表示数据从3个变成了1个,只丢失了颜色信息,可以想象这样计算机处理起来会更简单更快。
五、习题
1.多选题:以下A、B、C、D四个说法中正确的有?()
A:在RGB中我们分别用3个0到255之间的数字表示在红、绿、蓝三个颜色上的强度,由不同强度的这三种颜色,组成丰富的色彩。
B:RGB能够表述的色彩是无限多的,世间任何颜色都能表示出来。
C:灰度图像中一个像素点由0到255之间的数值表示颜色的深浅,灰度图像起到了降维的作用,计算机及程序处理灰度图像会比处理 RGB 图像要快。
D:图片的形状shape是(3,2,3)
正确答案:ACD
解析:B错误,RGB只能排列组合出16000种颜色,并非无限多
2.多选题:以下六个说法中正确的有?()
A:安装opencv库的命令pipInsta11opencv
B:安装opencv库的命令是pipinsta11opencv-python
C:导入opencv库的代码importcv2
D:导入opencv库的代码是importopencv
E:读取图片可以使用image_array=cv2.imread(图片文件名)
F:查看图片的维度信息可以使用image_array.shape
正确答案:BCEF