目录
2.2、MATLAB、OpenCV、Python中的图像都是什么
1、数字图像的构成
简单说,数字图像其实就是能在计算机上显示和操作的图。要说图像,其实必须得先讲图像得成像原理。大家通过中学得学习都了解三原色的知识:
当然,在计算机的表示中,采用的光学三原色方式存储的。这里就简单的说一下,人们将不同的颜色进行细分,有点类似于AD转换的原理,就是把模拟量按一定的精度以二进制存放到计算机里面,以用于计算和显示。
详细说的话得借用朱有鹏老师的介绍:
颜色在计算机中的表示
1.1、颜色的本质
(1)颜色是主观存在的,颜色其实是自然光在人的眼睛中和大脑中产生的一种映像。
(2)颜色的本质决定于光的波长
1.2、自然光的颜色是连续的
光的波长是连续的,导致颜色也是连续的。理论上,只要眼睛的分变能力足够好,可以在自然界中发现无数种颜色。
根据图像特性可以分为两类:位图和矢量图。位图在我们常见的图片格式中主要是BMP、JPG、GIF等,位图表现为像素构成的图像,就是各种点形成的。而矢量图则由矢量数据库表示,最常见的就是 PNG 格式的图。矢量图缩放不会造成图像的失真,入下图[1]:
图像类型 | 组成 | 优点 | 不足 |
位图 | 像素 | 只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象,逼真地表现自然界的景象 | 缩放和旋转容易失真,同时文件容量较大 |
矢量图 | 矢量 | 文件容量较小,在进行放大、缩小或旋转等操作时图象不会失真 | 不易制作色彩变化太多的图象 |
本系列主要采用位图来做处理。
2、不同环境图像的存储方式
2.1、计算机中的颜色是离散的
(1)计算机中不可能存储无数种颜色,所以必须将颜色有限化,所以就用有限种颜色来代表自然界种的无限种颜色。这个理论类似于AD转换。
(2)这种离散化的缺点是不够真实,漏掉了很多种颜色。因此计算机种所能表示的颜色不如自然界中的丰富(计算机屏幕上显示的图像和真实图像有差别)。
(3)计算机所能表达的颜色种类个数,这个参数就叫像素深度。
1位:一个二进制位表示颜色,这种就叫单色显示。实例就是小饭店、理发店门口的LED屏。
8位:用8个二进制位来表示颜色,此时能表示256中颜色。这种叫灰度显示。这时候是黑白的,没有彩色。我们把纯白到纯黑分别对应表示255-0。中间的数对应不同的灰。实例就是以前的黑白电视机。
16位:用16个二进制位表示颜色,此时能表示65536种颜色。这时候就可以彩色显示了。一般采用RGB565的颜色分布(5位二进制表示红色、6位二进制表示绿色、5位二进制表示蓝色)。这种红绿蓝都有的颜色表示法就是一种模拟自然界中所有颜色的表示方式。但是因为RGB的颜色表达本身二进制位数不够多(导致红绿蓝三种颜色本身分的都不够细致),所以这样显示的彩色失真比较严重,所以人眼能明显看出显示的不真实。
补充:颜色的组成,三原色RGB。
24位:用24个二进制位表示颜色,能够表示16777216。这种表示方法和16位表示原理一样,只是RGB三种颜色各自的精度都更高了,RGB888。比RGB565更加真实细腻,虽然说比自然界无数种颜色还是少了很多,不过由于人眼的不理想性,人眼是感受不到这种差别,于是把RGB888的表示方法称为真彩色;RGB565位伪彩色。
32位:总共用32位二进制表示颜色,其中24位表示红绿蓝三原色,仍为RGB888,剩下的8位表示透明度。这种显色方式就叫ARGB(A为alpha,表示透明度),现在的PC中一般都是ARGB表示颜色。
2.2、MATLAB、OpenCV、Python中的图像都是什么
在考试的时候可能会遇到这样的问题:"opencv里面RGB图像的存储方式是什么?"
(1)、MATLAB 是一个强大的数学计算软件,MATLAB 中的图像是作为三维矩阵来存放的。
上面的黑线不知道哪里来的,原图是直接从百度扣下来的!!
MATLAB直接作为矩阵操作即可。
颜色 | R | G | B |
红色(0xFF0000) | 255 | 0 | 0 |
绿色(0x00FF00) | 0 | 255 | 0 |
蓝色(0x0000FF) | 0 | 0 | 255 |
(2)OpenCV 是一个开源的图像处理函数库,主要由C++写成。
图像在OpenCV中的存放方式与MATLAB不同,大家可以参考[2]。
颜色 | R | G | B |
红色(0x0000FF) | 255 | 0 | 0 |
绿色(0xFF0000) | 0 | 255 | 0 |
蓝色(0xFF0000) | 0 | 0 | 255 |
在OpenCV中,红色存储在低位,蓝色存储在高位上。
(3)Python 不使用OpennCV的情况下
Python是一种跨平台的计算机程序设计语言[3]。,可以通过各种各样的模块来进行各种开发项目。本系列主要针对 PIL 模块进行图像处理的研究。
图像在Python中的存放方式与MATLAB中相同,也是采用了类似于矩阵的形式。Python中用于图像处理的库主要有PIL和matplotlib,并且常常结合numpy来使用。其中matplotlib受到matlab的启发,是绘制各类可视化图形的重要工具。
理解图像的存储方式对于后续的计算和使用十分重要!!!!!
3、图像中的信息
通过视觉,人和动物感知外界物体的大小、明暗、颜色、动静,获得对机体生存具有重要意义的各种信息,至少有80%以上的外界信息经视觉获得,视觉是人和动物最重要的感觉[4]。
在数字图像处理中,图像含有很多有用的信息,提取出来这些信息是图像处理的主要工作。这些信息有轮廓、颜色等。
4、数字图像处理的基本步骤
数字图像处理的步骤主要有以下[5]:
(1)图像的点运算:如图像的拉伸、对比度增强、直方图均衡和直方图匹配等;
(2)图像的几何变换:主要应用于图像的几何归一化;
(3)图像的增强;
(4)小波变换;
(5)图像复原;
(6)彩色图像处理;
(7)图像分割;
(8)特征提取;
(9)对象识别。
5、预备知识
5.1、邻接性、连通性、区域和边界
5.1.1 邻接性
邻接性主要用于确定像素之间的相似程度,主要有3种邻接关系[5],如图:
相似性其实是有主观标准的。另外,邻域的定义是有数学形式的。
首先定义一个概念,就是 为对角邻域,即第三幅图所示的位置;另外,定义V用于决定邻接性的灰度值集合,用于确定像素之间的相似度,假设我们认为只有灰度值为1的像素是相似的,则V = {1},假如我们认为 灰度为0,1,2的像素是相似的,那么V = {0,1,2}。即 V 是相似灰度值(或彩色值)相似的值的集合。
4-邻接:设一个像素 Q满足 Q 在 P 的四邻域内,即 ,则称V中两个数值的像素 P,Q 是 4 邻接的。
理解:这里要求的四邻接有2个条件,首先,像素 Q满足 Q 在 P 的四邻域内;其次像素P和Q的灰度值要在V中,这样才能称为 4 邻域。
同样,8-邻域也是这样定义的。
5.1.2、连通性
连通性的定义与邻接性相关,首先定义一个通路(Path)的概念。
通路:是指两个不同位置的像素P(x0,y0),Q(xm,yn),从一个像素出发,存在至少一个特定的像素序列 (xi,yj) i=0,1,...m,j=0,1,....,n。使对所有的 与 ,1<=i,j<=m,n是邻接的。则这个像素序列就称为通路。
连通性:令S代表一幅图像的像素子集。如果在S中全部像素之间存在一个通路,则可以称2个像素P,Q在S中是连通的。此外,对于S中任何像素P,S中连通到该像素的像素集叫做S的连通分量,如果S中仅有一个连通分量,则集合S叫做连通集。
上图中,阴影部分为图像子集S,而 V={1}。则红线表示连通分量。
5.1.3、区域和边界
区域的概念是建立在连通集上的,令R是图像中的一个像素子集,如果R同时是连通集,则称R为一个区域。
边界是相对于区域而言的,一个区域的边界是区域中所有有一个或多个不在区域R上的邻接像素或像素的集合。
5.1.4、度量图像的距离
假设对于像素 P(xp,yp)、像素Q(xq,yq)、R(xr,yr)满足如下三个条件,有函数D,则D为距离。
(1)D(P,Q) >= 0,当且仅当P=Q时,D(P,Q)==0;
(2)D(P,Q) = D(Q,P);
(3)D(P,Q)<= D(P,R)+D(R,Q);
常见的距离函数:
(1)欧式距离:
其实就是两点之间的距离公式,表示直线距离;距离等于 r 的像素形成以P为圆心的圆。
(2)D4距离(街区距离)
我觉得这个看名字就知道了,也就是通过四邻域形成的距离。
(3)D8距离,同(2),由8邻域形成的
5.2、图像的基本操作
5.2.1、点运算和邻域运算
点运算是指对图像中的每一个像素都进行灰度变换。
5.2.2、线性和非线性操作
线性变换通常由线性算子给出,例如平均平滑滤波、高斯平滑滤波、梯度锐化等。
参考:
【1】图片来源 https://zhidao.baidu.com/question/109059224.html
【2】https://my.oschina.net/u/3919756/blog/1936776
【3】https://baike.baidu.com/item/Python/407313?fr=aladdin
【4】https://baike.baidu.com/item/%E8%A7%86%E8%A7%89/5228?fr=aladdin
【5】佚名. 精通Matlab数字图像处理与识别[M]. 2013.