计算机是如何看到图像的

news2024/10/5 3:27:50

本节课为「计算机视觉 CV 核心知识」第 4 节;

「AI秘籍」系列课程:

  • 人工智能应用数学基础
  • 人工智能Python基础
  • 人工智能基础核心知识
  • 人工智能BI核心知识
  • 人工智能CV核心知识

在这里插入图片描述

本文涉及代码:https://github.com/hivandu/AI_Cheats

Hi, 大家好。我是茶桁。

今天我们来讨论一个问题:计算机是如何看到图像的

那计算机到底是如何看到图像的呢?我们一点点来看:

首先是照相机内,又或者是我们手机上的摄像头。咱们的手机本身也是有 CPU 的对吧?除此之外,其实手机内还有感光器件和感光传感器的,这个感光器又叫 CMOS, 亦或是 CCD。这两者其实也是有区别的,CMOS 全称为 Complementary Metal Oxide Semiconductor, 是互补氧化物半导体,而 CCD 是 Charge-Coupled Device,含义是电荷耦合器件。

那么感光器是如何感光的呢?实际上它的表面类似于一个矩形,当然圆形的也有,一般是矩形的,圆形的很少了。

一个矩形的感光器件,当光线打入,照射到这个感光器件上,后台就会产生一个电流或者电压,光线越强电压越强,光线越暗电压越小。但其实 CCD 和 CMOS 在这方面也是有一些区别的,像元信号 CCD 是电荷,CMOS 是电压。我们就都先按电压来理解,反正就是照射出来的光线的强度决定了感光器件每个位置的电压高低。换句话说,电压的高低直接就显示出来当前射进来光线的强弱了。

那我们知道一张图像就是由光线的强弱组成的,每个图像本身一些位置光线强,一些位置光线弱。图像由明暗组成就形成了纹理,这个纹理就是黑白图像。所以我们感光元器件通过这种方式,就可以把纹理测出来了,通过用电压的方式表示出来。电压要存储到后面的存储器上存储起来。曝光时间结束的时候,来自传感单元的电荷同时传输到所有像素的中间存储器,并通过垂直和水平位移从那里读出。

在这里插入图片描述

那么你看,因为它每个位置都存储有一个值,要存储的值也就非常多。到底有多少个值,要涉及到多少个位置。那么多少个位置呢,因为光线有无数,感光器的最小感光单元也是有无数条光线的,这是一个区域内的光线。我们这个感光元器件只能看它的分辨率是多少,就是它的最小的感光元器件多少,它测的是最小的感光元器件的区域所有的光线之和的强度。

也就是说这个感光元件上有多少个最小单位的感光单元,排列成 N 行 M 列的这种形式,最后存储的数字就是 N 行 M 列。把光线的明暗存储成数字来表达,最后存储的数字就是一个图片了,就用矩阵来表示图片。

另外,射入这个感光元件的每个感光单元的光线一定是垂直的。在现实中,各种方向都有可能让这个感光元件发生反应。因为垂直的我们好衡量,所以就有了透镜。透镜的作用是什么,最后你都是这个方向来,朝这个方向走,加这样的一个镜片。就这是摄像头内部的一个结构,我们大概理解一下是如何成像的。

之前讲过,感光器这个矩阵后面每个位置都有个值,这个值并不是直接成像的。这个值有高有低,它是电压值的范围。比如说零点几伏,或者是零点几微伏。计算机视觉这个程序中处理的图像,我们看到这个图像的取值都是 0-255 这样的数字,实际上这就是电压的值。后面还是要经过一些处理,做一下归一化,把它归一化到 0-1 范围内然后输出出来,保存成图片。

这个归一化后输出的范围是个矩阵,再保存为图片,比如说保存成 jpg、png 等各种格式。而大部分图片格式几乎都是用了一种压缩办法,jpg 就是其中最流行的,压缩之后将图片保存下来。

这个原因是因为图片如果直接保存的话矩阵量非常大,比如说 600*800 的图片,48万的数字。48万的数字保存的 txt 文件那是非常大的,所以才需要压缩一下,一是为了压缩后便于保存,占用更小的磁盘或者硬盘空间,也是为了便于传输。特别是互联网最初拨号上网的年代。在以前,磁盘和带宽都是非常费钱的。

当然,现阶段咱们手机流量已经很便宜了,手机的内存空间也再渐渐增加。还记得刚拿到第一款 Android 手机——HTC G1, 那会儿我尝试着跑了一下 Google Earth,前后没 1 分钟,就跑了 10 多块钱,而且那龟速的移动网络,地图都还没完全打开。说回正题,由于存储以及传输的需求,我们就用压缩办法把这个矩阵存储下来。

总结一下,图片从摄像头采集成电压的值,然后进行传输和存储,再进行归一化,然后再用压缩办法把它压缩成图片。关于图片格式,目前不进行图片压缩进行存储的格式有 BMP 和 TIF,其中 TIF 和 Photoshop 的源文件有点类似,包含了分层信息以及透明通道信息。这就是图片为什么存储矩阵,以及大体的流程。

那么存完之后如何显示呢?我们用显像管或者显示屏显示。现在图片存储为了一个矩阵,显示的时候怎么办呢?

我们来想象有一盏灯,现在有三个电压经过它,电压为 1 的时候,这个灯就是最亮的,电压为 0 的时候,这盏灯就是暗的,如果是 0.5 呢?那这盏灯就没那么亮,也就是给它的电压小一些,灯就稍微暗一些,不那么亮,也不那么暗。

在这个显示屏上有无数的灯,每个灯其实都对应的有它的一个像素值,就是它亮度值对应它灯的亮度值。所有灯排列起来就是一幅图像。不过这个显示出来之后是一个黑白的图像,如果我们最后存到的值只有 0,1 这两个值,这时候的图片我们叫它二值图,它显示出来就是非黑即白的这种图片。

data = [[0, 1, 1, 0, 1, 0], [1, 0, 1, 1, 0, 0], [0, 0, 0, 1, 0, 1], [0, 0, 0, 1, 0, 1], [1, 0, 1, 1, 0, 0], [0, 1, 1, 0, 1, 0]]

plt.imshow(data, cmap='Greys_r')
plt.show()

20240701235840

如果我们的值是在 0 ~ 255 范围内,或者在 0~1 之间有浮点值,我们称呼其为灰度图。这个和二值图的区别在于,灰度信息就不只是 2 个值了,而是灰度级更多了。

data2 = [[0, 1, 0.5, 0.5, 1, 0], [1, 0, 1, 1, 0.5, 0], [0, 0, 0.5, 1, 0.5, 1], [0, 0.5, 0, 1, 0.5, 1], [1, 0, 0.5, 1, 0.5, 0.5], [0, 1, 0.5, 0.5, 1, 0]]
plt.imshow(data2,  cmap='Greys_r')
plt.show()

20240702000409

注意到「灰度级」这个概念。二值图中,灰度级就只有两个,一个 0,一个 1,中间没有任何值。而如果是 0~255,或者是 0~1 之间加上浮点值,那么这个灰度级就多了,也就更细腻一点了。我可以表示黑,也可以表示白,也可以表示中间的灰度。 0~1 中间的灰度级就是无数个。

这里补充一下,0~1 表示图像和 0~255 表示图像,这两种方法在我们是初学者的时候,显示图像通常会遇到一些问题。如果一个图像矩阵的取值范围是 0~255,那么它就必须都是一个整数值,如果出现浮点数值,比如说 1.025, 255.0 这种,它是一个 float 型的。那这个时候直接去显示这样一个矩阵,你就会发现很多程序内图片会是全白的,当然并不是所有的程序中都会如此。这是为什么呢?是因为我们显示软件中如果是 float 型的,就默认你的取值范围是 0~1, 如果你是 0 的话就是黑色,如果是 1 的话就是白色。

部分程序中,就自动做一次归一化,就是将 1.0 ~ 255.0 的数值归一到 0~1 的范围之内,然后再做显示。

data4 = [[0.0, 255.0, 255.0, 255.0, 255.0, 255.0], [255.0, 255.0, 255.0, 255.0, 255.0, 255.0], [255.0, 255.0, 255.0, 255.0, 255.0, 255.0], [255.0, 255.0, 255.0, 255.0, 255.0, 255.0], [255.0, 255.0, 255.0, 255.0, 255.0, 255.0], [255.0, 255.0, 255.0, 255.0, 255.0, 125.0]]
plt.imshow(data4,  cmap='Greys_r')
plt.show()

20240702111930

如果矩阵中的数据是 0.0~255.0 的浮点数从而导致了图片显示不正常,就需要先将所有数值都改为整数型,这样正常的灰度级就有了。所以如果你拿到一张图片,处理完之后显示出来发现不正常,要么是全黑,要么是全白,这时候你就需要去看一下你的数据类型对不对了。

接下来咱们一起看一个视频,这个视频充分说明了像素矩阵来表示图像这个例子:

视频中可以看到,每个同学其实就代表矩阵中的一个元素,这个元素是包含了两种颜色,也是二值图。白和红这两色,其实就对应咱们的 1 和 0。这个以方阵的形式表示矩阵,以每个同学作为一个像素来表示图像的方法就体现出来了。现在我问你,如果让你去当一个教官,去设计这样的一个方阵表演,你会怎么去协调每个同学呢?

实际上每个同学,不管是喊口令,数拍子,其实就只需要知道自己当前是举 0 还是举 1 就行了,对吧?也就是说,这个看着好像蛮复杂的,实际上这个表演起来如果是学计算机的人去设计,就不那么困难了。比如咱们左下角的同学,他基本上就是举白的,也就是大部分时间内就举个0就行了。

中间有些同学可能一会要举 0,一会要举 1,但基本上每个同学的工作量其实并不大。就告诉你,你数到几的时候举什么牌子就行了。

大概看一下,这个其实看起来比较抓眼球,我们知道它是用矩阵表示图像就行了。

OK,我们刚才看这个图片呢,介绍了二值图像,黑白图像,因为只有两个值。也介绍了灰度图,一共包含了 256 个灰度级。

现在,我来问你们一个问题:彩色图像如何表示

彩色图像其实跟我们二值图像的显示方法是一样的,显像管和显示屏来显示,显然我们一个采样图像最终是要通过显像管和显示屏来显示出来的。那么通过显示屏来显示的时候,显示屏中每个位置还是有灯对吧?那现在咱们的电脑屏幕不像刚才是一样是灰度图了,而是彩色的,那么彩色显示它是什么原理呢?

彩色显示是因为每个像素内我有三个值,蓝灯、绿灯、红灯。这三个值就是我们所熟知的RGB,即是三原色,那这三个值就可以合成任意颜色。也就是说,你想让这个像素显示成任意颜色都可以,这个像素发出来的光是任意颜色的光。只需要调整红,绿,蓝之间的比值就可以了。

在这里插入图片描述

所以我们在每一个像素的位置都放三个灯,然后调整亮度值就可以了,这样我们就可以用来显示这个彩色图像了。那显示这个彩色图像的时候我们是需要数据来支撑的,就是说这个位置这个蓝色的灯到底要亮多少,这个红色灯要亮多少,绿色灯到底它亮度给多少。这些呢,都是有值的。

所以说每个像素的位置我们有3个值,R 值是多少,G 值是多少,B 值是多少。我们如果这样一个位置三个值写一行的话,比如这是 m 乘 n 的图像,那它就是 3 ∗ m ∗ n 3 * m * n 3mn 这样的一个矩阵了。但这种表示方式其实不是那么直观,更直观的方式是什么?我们把所有位置的 R 作为一个 m * n 的矩阵,然后 G 也如此,B 也如此,于是就有了如下三个矩阵:

在这里插入图片描述

因为彩色图像显示每个位置要用3个灯来显示,所以彩色图像的表示就用 3 个矩阵来表示,这样就表示了彩色的图片了。

那为什么一定是红、绿、蓝作为三原色而不是其他的呢?原因是因为咱们现实世界中生产红、绿、蓝色的灯相对容易些,造价也更低一些,技术相对更成熟一些,生产其他颜色的灯技术不成熟。就这么个原因。这就是为什么我们现实中常常说RGB的原因。

OK,这是彩色图像。到现在为止,我们图像的显示方式讲了几种:一个是二值图,这个图的取值方式是 0 和 1,数据类型是整型,然后是灰度图,每个像素的取值范围是 0~1 的浮点数,或者是 0~255 的整型。其实这两种统称为灰度图,可以表示同样的内容。但是你要注意它的数据类型,显示不正常的时候就看一下数据类型对不对。

接着是第三种,我们讲了彩色图形的显示,表示方式为 RGB。原来表示灰度图、二值图用一个矩阵就行了,现在表示彩色图我就需要三个矩阵了。因为什么?我要三原色合成任意颜色。

除此之外,我们还讲了为什么图像要用矩阵的表示方式。理解了图像的矩阵表示方式之后,接着我们来整理一下计算机视觉整体的一个流程和表现。

在这里插入图片描述

首先,镜头完成一个图像的采集,采集的是电压的值。这个电压的值我们需要对其进行归一化,得到一个数字的矩阵。然后我们将这个矩阵进行存储、修改并显示。当然这样一个数字化的矩阵我们还可以进行 copy,转移。其实老式相机也几乎是这样一个过程,可以这样去理解,只是我们现在是将这个矩阵存储到存储设备上,而老式相机是将其存储到了底片上。

因为是这样一个过程,采集完成之后是用矩阵来显示的,所以我们最后对图像进行处理其实就是对这个矩阵进行处理了。所以,我们可以得出一个结论:计算机视觉它主要是处理矩阵的。因为处理图像就是处理矩阵,计算机视觉可以视为就是在处理图像,所以计算机视觉本质上就是在处理矩阵。

现在我们来看,咱们之前说的所有的内容:人脸检测、人脸识别、美颜功能,手势检测、换脸换妆、自动驾驶、活体检测等等这些应用,它其实都是在对矩阵进行处理。那我们以后要讲的计算视觉的各种模型,它的分类模型、检测模型、分割模型、跟踪模型等等,还有一些其他的模型,这些也都是对矩阵的处理。

好,到此,今天我们所要讨论的,计算机视觉到底是如何看到并显示图像的我们也就有了一个清晰的概念。下一节课,咱们来讲讲计算机处理图像的方式和方法。

好,下节课再见,大家拜拜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL备份】Percona XtraBackup压缩备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.安装qpress 3. 压缩备份 3.1.创建压缩备份 3.2.创建全量备份 3.3.对比两个备份的大小 4.解压备份 5.准备备份 6.备份恢复 ​7.问题分析 8.总结 "实战…

网络连接之队头阻塞!!!

一、什么是队头阻塞 队头阻塞,在网络模型中简单理解就是,对于队列型的请求模型,如HTTP的请求-响应模型、TCP的ACK确认机制,都依赖得到一个具体的响应包,如果收不到这个响应包,那下一个请求就不能发&#x…

太阳辐射系统日光全光谱模拟太阳光模拟器

太阳光模拟器是一种用于评估太阳能电池性能的重要设备。它能够模拟太阳光的特性,通过测试电池的短路电流、开路电压、填充因子和光电转化效率等关键指标,来评估电池的性能优劣。 设备型号:KYF-GC004品牌制造商:科迎法电气太阳光模…

08 docker Registry搭建docker私仓

目录 本地镜像发布流程 1. docker pull registry 下载镜像 2. docker run 运行私有库registry 3. docker commit 构建镜像 4. docker tag 修改新镜像,使之符合私服规范tag 5. 修改配置文件使之支持http 6. curl验证私服库上有什么镜像 7. push推送 pull拉取 …

C# WPF自制批注工具(方便标记重点和演示)

在教学和演示中,我们通常需要对重点进行批注,下载安装第三方工具批注显得很麻烦。本篇使用WPF开发了一个批注工具,工具小巧,功能丰富,非常使用日常免费使用,或者进行再次开发。 自制批注工具具有以下功能特…

构建 Audio Unit 的流程

构建 Audio Unit 的流程 构建 Audio Unit 的流程指定 Audio Unit 的类型创建 Audio Unit设置 Audio Unit 的属性 构建 Audio Unit 的流程 iOS 有一个用于直接处理 audio units 的 API,另一个用于处理 audio processing graphs,可以同时使用这两种 API。…

第十四章 路由器 OSPF 动态路由配置

实验目的 掌握 OSPF 协议的配置方法: 掌握查看通过动态路由协议 OSPF 学习产生的路由; 熟悉广域网线缆的链接方式; 实验背景 假设校园网通过一台三层交换机连到校园网出口路由器上, 路由器再和校园外的另一台路由器连接。…

【C++题解】1456. 淘淘捡西瓜

问题:1456. 淘淘捡西瓜 类型:贪心 题目描述: 地上有一排西瓜,每个西瓜都有自己的重量。淘淘有一个包,包的容量是固定的,淘淘希望尽可能在包里装更多的西瓜(当然要装整个的,不能切开…

开放签电子签章,让签字有迹可循

开放签(企业版)V2.0.5版本上线后,系统支持一键查询电子文件的签署操作记录,支持一键生成详细的签署记录报告,详细请看下图: 1、操作记录详情: 从合同发起、填写、签署、撤销等环节全流程展示操…

创新与增长:eBest完美收官FBIF2024食品创新展

FBIF2024食品创新展今天在上海会展中心圆满落幕。此次大会以食品创新、渠道创新、营销创新及科技创新为主题,为众多参展企业及来宾带来一场蕴含创新思维的盛宴。 为什么要“破卷出新”?如今中国食品品牌面临的最大挑战就是在国内饱和的市场里出爆品&…

CTFHUB-SSRF-Redis协议

本题需要用到: 在线编码网址:https://icyberchef.com/ gopherus工具:https://mp.csdn.net/mp_blog/creation/editor/139440201 开启题目,页面空白 和上一个题FastCGI协议一样,还是使用gopherus攻击redis ./gopheru…

【操作与配置】VSCode配置Python

Python环境配置 可以参见:【操作与配置】Python:CondaPycharm_pycharmconda-CSDN博客 官网下载Python:http://www.python.org/download/官网下载Conda:Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

端口聚合基础知识

一、什么是端口聚合 端口聚合是将多个物理端口捆绑在一起,形成一个逻辑链路,以实现带宽增加、提高冗余和负载均衡的技术。端口聚合,也称为以太通道(Ethernet Channel),主要用于交换机之间的连接。在具有多…

我爱服务器——LVM实战学习

后来呀,天亮之前毕业后踏入服务器领域了。。。。。。 LVM(Logical Volume Manager)是一个高级的磁盘管理框架,它允许用户将多个物理硬盘组合成一个逻辑卷,从而提供更大的存储空间、更高的灵活性和更好的数据管理能力。…

系统安全与应用

目录 1. 系统账户清理 2. 密码安全性控制 2.1 密码复杂性 2.2 密码时限 3 命令历史查看限制 4. 终端自动注销 5. su权限以及sudo提权 5.1 su权限 5.2 sudo提权 6. 限制更改GRUB引导 7. 网络端口扫描 那天不知道为什么,心血来潮看了一下passwd配置文件&am…

分布式锁的详细解析

分布式锁工具 一、背景 当前问题:项目中会使用到分布式锁用于定时任务、接口幂等性处理,但是分布式锁的实现较简单,会出现执行超时、加解锁失败等场景。分布式锁都有哪些实现,他们的优劣势是什么呢? 二、现有技术 分…

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图,现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图,你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息:2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

让围绕数据库构建大模型应用更简单方便--DB-GPT

DB-GPT的目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单,更方便。 1 处理流程 DB-GPT系…

《涅朵奇卡:一个女人的一生》读后感

这周的计划是看完海明威的《丧钟为谁而鸣》,但是因为下班晚,而且书的体量大,所以只看了一半。本来以为这周的阅读计划完不成了,不料昨天加完班后拿起新到的《涅朵奇卡:一个女人的一生》,不自觉就陷进去了&a…