机器视觉入门之一 认识位图

       机器视觉的应用领域就不再赘述了,那么什么是机器视觉?简单的说机器视觉指一种应用于工业和非工业领域的硬件和软件组合,它基于捕获并处理的图像 为设备执行其功能提供操作指导。因此,成像和图像处理分析是机器视觉两大主要构成部分。大多数机器视觉是需要实时处理的,获取图像的手段主要是摄像机,无论是静止图像或是视频流实质上都一样,视频流也不过就是每秒若干帧的静止图像,如每秒15帧(15fps)。

       大多数机器视觉的应用是不需要存储图像文件的,但是处于分析测试的需要,我们往往也需要存储图像数据。那么,什么是图像?机器视觉是处理图像的,这里我们说的图像其实是位图,也就是Bitmap,注意,不是图形,一般我们说图形在计算机领域有特指,就是矢量图Graph。我们这里只讨论位图。

     Bitmap,顾名思义就是使用Bit来表示的Map,至于多少个Bit,我们后面再说,首先,我们可以把图像理解为一个二维点阵,如下图:

机器视觉入门之一 认识位图_第1张图片

 我们如果放大房子屋顶部分,可以看到图像是由一个一个的像素点Pixcel构成的:

机器视觉入门之一 认识位图_第2张图片

 所以才有了我们买手机时多少像素这一说,其实分辨率是用dpi来表示,也就是dot per inch,这里dot也是点,顺便说一下,平时我们打印彩色图像,300 dpi就够了,需要多少像素,根据尺寸可以自己算一算,长*宽。

   一个一个像素,在计算机中这么表示色彩呢?计算机使用的就是二进制,当然,二进制,10进制,16进制无非就是显示方式不同,在内存或是硬盘中,只能有0或1而已。拿我们最常用的24位图像来说,为什么是24位?我们在计算机中表示颜色时,使用的是RGB色系,也就是红、绿、蓝三种颜色构成我们可见光中的任意一种颜色(严格说是人眼能分辨的颜色)。如果每种颜色的范围为0~255,那么三种颜色在一起可以表示16777216种颜色,也就是约一千六百万种颜色,这个基本是超过人员的辨识范围了。0~255,看着熟悉吗?这就是一个字节能表示的范围,所以,三个颜色一个像素需要三个字节,每字节8bit,三八二十四,那就是24位的来历

    我们处理图像,必须要先把图像放到内存中,初学时,可以先从文件读取到内存中,在内存中,情况比较复杂,因为32位计算机系统存储运算单位是四个字节一组,64位计算机系统是8个字节一组,当然,由于我们使用的计算机访问内存的最小单位是字节,我们也可以按字节读入,这样比较省内存,但是计算时,系统还是按4个字节或8个字节,因为它的总线就是这样的宽度。

例如,我们建立一个100*100像素的图像文件,可以用PS,那么总像素数就是10000,24位的需要10000*3=30000字节,30000/1024=29.3kB,注意,是大B,不是小b,小 b是bit。大家可以看到我们计算的是否正确:

机器视觉入门之一 认识位图_第3张图片

 图像创建完成后我们可以存储到磁盘查看里面的数据,存储之前,我们在图像中填充一些颜色,颜色值为R=65,G=66,B=67这是一个灰色:

机器视觉入门之一 认识位图_第4张图片机器视觉入门之一 认识位图_第5张图片

 我们将这个图像存盘,注意,存储为BMP格式,至于为什么,原因很简单,BMP格式是原始图像的数据格式,名字就可以看出来Bitmap,我们平时用的大多数是压缩的格式,而且大多是有损压缩,所以不适合初步学习。存储完成后,我们使用16进制查看软件,如UltraEdit或WinHex查看内容:机器视觉入门之一 认识位图_第6张图片

 可以看到,文件开头有两个字节:42 4D,对应ASCII为BM,这就是BMP文件格式的标识,后面有42个字节,加上那个BM,一共44个字节,其实前面14个为文件头信息,后面40个为位图头信息,大家可以看相关资料,太多了:https://zhuanlan.zhihu.com/p/26067154。44个之后才是我们的图像数据,这里面三个字节一个像素,总像素数在头信息里有,其中第二行的两个16进制64就是图像的长、宽。我们可以看到,图像数据大部分都是FF,这是因为图像中大部分都是白色,而白色就是R=255,G=255,B=255,那就是16进制的FF了。刚才我们填充了一个灰色的区域,我们的颜色是R=65,G=66,B=67,对应16进制为41 42 43,通过观察我们发现实际的存储顺序是BGR,后面在ASCII码区我们为什么看到的是CBA?ASCII需要补课了:)。

当然,目前看到的还没有这么简单,这只是24比特的位图,我们还有16比特、8比特、甚至1比特的位图,而且还可能有调色板,相对24比特的最简单,我们先消化吸收一下。注意一个问题,图像的像素并不一定按照左上角到右下角的顺序存储,如果需要这么做,我们需要在位图头信息中的u32 biHeight; //bmp height位置做文章了,而且,由于计算机中要求没一行字节数是4的倍数,所以,存盘时应用程序会根据每行像素数进行补位,这些东西,我们下一次再讲。

 

你可能感兴趣的:(图形图像,VC++编程技巧,计算机视觉,人工智能,图像处理)