计算机视觉

第一章 计算机视觉概述

一、基本概念

1. 什么是计算机视觉

  • 计算机视觉(Computer Vision,简称CV)在广义上是和图像相关的技术总称。包括图像的采集获取,图像的压缩编码,图像的存储和传输,图像的合成,三维图像重建,图像增强,图像修复,图像的分类和识别,目标的检测、跟踪、表达和描述,特征提取,图像的显示和输出等等。
  • 随着计算机视觉在各种场景的应用和发展,已有的图像技术也在不断的更新和扩展。

2. 计算机视觉的应用

  • 计算机视觉技术已经在许多领域得到了广泛的应用,以下是一些典型的例子:

    • 公安安防:人脸识别,指纹识别,场景监控,环境建模。
    • 生物医学:染色体分析,X光,CT图像分析,显微医学操作。
    • 文学处理:文学识别,文档修复,办公自动化,垃圾邮件分类。
    • 国防军事:资源探测,军事侦察,导弹路径规划。
    • 智能交通:公路交通管理,电子警察执法抓拍系统,自动驾驶车辆。
    • 休闲娱乐:电影特效,视频剪辑,人像美颜,体感游戏,VR。

3. 计算机视觉与人工智能

  • 计算机视觉中的大部分理论运用了人工智能的技术。人工智能的发展离不开计算机视觉,计算机视觉中的很多应用问题给人工智能技术提供了研究方向。
  • 人工智能在计算机视觉中最成熟的技术方向是图像识别,它实现了如何让机器理解图像中的内容。

二、数字图像处理基础

1. 人眼成像原理

  • 人的眼睛近似为一个球体。物体的光线通过角膜和晶状体的折射,在视网膜上成倒立缩小的实像。
  • 视网膜上分布光线接收的神经细胞,分为锥状体和杆状体。每只眼睛有600万-700万个锥状体,其对颜色灵敏度很高,负责亮光视觉。有7500万-15000万杆状体,杆状体没有颜色感觉,负责暗视觉。

2. 计算机成像原理

  • 数字图像的采集过程类似人眼,使用大量的光敏传感器构成的阵列获取图像。成像的质量由传感器的单元数,尺寸和传感性能决定。
  • 多数传感器的输出是连续的电压波形,图像数字化就是将一副画面的数据转换为计算机能够处理的数字形式。
  • 图像数字化包括两种处理过程:采样和量化。

3. 图像采样与分辨率

  • 将空间上连续的图像变换成离散点的操作称为采样
  • 采样是按照某种时间间隔或空间间隔,采集模拟信号的过程,即空间离散化。
  • 图像数字化的采样过程是将空间上连续的图像变化为离散的点。
  • 采样的效果由传感器的采样间隔和采样孔径决定,采样间隔和采样孔径的大小是两个很重要的参数。
  • 采样后得到离散图像的尺寸称为图像分辨率。(分辨率就是使用多少个像素点来表示一幅图像)分辨率是数字图像可辨别的最小细节。
  • 分辨率由宽(width)和高(height)两个参数构成。宽表示水平方向的细节数,高表示垂直方向的细节数。
  • 例如:
    • 一副640480分辨率的图像,表示这幅图像是由640480=307200个点组成。
    • 一副19201080分辨率的图像,表示这幅图像是由19201080=2073600个点组成。
  • 采样间隔越小,所得图像像素数越多,空间分辨率高,图像质量好,但数据量大。下图展示了lena图的分辨率从512x512依次降低到8x8的图像效果。

4. 灰度级与灰度图像

  • 灰度级(depth)表征了每个采样点的传感器输出中可分辨的最小变化。
  • 灰度级通常是2的整数次幂。我们用m级或者n位来表示灰度级。图像数据的灰度级越多视觉效果就越好。计算机中最常用的是8位图像。
  • 例如:
    • 一副8位的图像,表示每个采样点有2^8=256级。从最暗到最亮,可以分辨256个级别。
    • 一副32级的灰度图像,每个采样点从最暗到最亮,可以分辨32个级别。
  • 量化等级越多,所得图像层次越丰富,灰度分辨率高,图像质量好,但数据量大。下图展示了lena图的灰度级从256级依次降低到4级的图像效果。
  • 单通道的数字图像被称为灰度图。通常,单通道记录了采样点的亮度信息,例如8位的图像,0表示最暗(黑色),255表示最亮(白色)。

5. 彩色图像与色彩空间

  • 为了表征彩色图像,我们需要使用多通道数字图像。最普遍的方式是使用RGB颜色空间。RGB颜色空间中每个像素点有三个维度,分别记录在红(Red)、绿(Green)、蓝(Blue)三原色的分量上的亮度。
  • 例如:
    • 按照(r,g,b)的方式:
    • (255,0,0)纯红
    • (124,252,0)草坪绿
    • (135,206,235)天蓝色
  • 另一种常用的颜色空间是HSV,该颜色空间可以用另一个圆锥来表示
  • HSV表示色相(hue)、饱和度(saturation)和亮度(value)
  • H表示颜色的相位角(hue),取值范围是0–360;S表示颜色的饱和度(saturation),范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率
  • V表示色彩的明亮程度(value),范围从0到1
  • YUV:亮度信号Y和两个色差信号R - Y、B - Y,最后发送端将亮度和色差三个信号分别进行编码。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图就是黑白灰度图。YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法。YUV色彩空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。与RGB视频信号传输相比,YUV只需占用极少的频宽。
  • CMYK:CMYK颜色空间应用于印刷工业,印刷业通过青©、品(M)、黄(Y)、黑(BK)四色油墨的不同网点面积率的叠印来表现丰富多彩的颜色和阶调。
  • Lab:Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大,自然界中任何一点色都可以在Lab空间中表达出来。

6. 颜色空间变换

  • 在计算机视觉中,尤其是颜色识别相关的算法设计中,各种颜色空间混合使用是常见的方法。RGB,HSV,YUV等常见颜色空间可以通过计算公式实现相互转化,这个过程叫做颜色空间变化。颜色变换的计算公式比较复杂,通常图像处理库会提供颜色空间变化的API给用户调用。

7. 常用图像处理技术

  • 色彩处理

    • 灰度化:将彩色图像转换为灰度图像
    • 二值化/反二值化:将灰度图像转换为只有两种颜色的图像
    • 色彩提取:提取指定的颜色
    • 直方图均衡化:调节图像统计直方图分布
    • 亮度、饱和度、色调调整
  • 形态相关操作
    • 仿射变换:旋转、平移
    • 缩放、裁剪
    • 图像相加、相减
    • 透视变换
    • 图像腐蚀、膨胀、形态学梯度
  • 色彩梯度
    • 模糊
    • 锐化
    • 边沿检测
  • 轮廓处理
    • 轮廓查找、绘制
    • 绘制矩形、圆型、椭圆
    • 多边形拟合

第二章 色彩变换

一、图像色彩调整

1. 亮度调整

  • 对HSV空间的V分量进行处理可以实现对图像亮度的增强。
  • 直接将彩色图像灰度化,也可以得到代表图像亮度的灰度图进行图像处理,计算量比HSV颜色空间变化低。但在HSV空间中进行处理可以得到增强后的彩色图像。

2. 饱和度调整

  • 对HSV空间的S分量进行处理可以实现对图像饱和度的增强。
  • 饱和度的调整通常是在S原始值上乘以一个修正系数。
  • 修正系数大于1,会增加饱和度,使图像的色彩更鲜明;
  • 修正系数小于1,会减小饱和度,使图像看起来比较平淡。

3. 色调调整

  • 对HSV空间的H分量进行处理可以实现对图像色调的增强。
  • 色相H的值对应的是一个角度,并且在色相环上循环。所以色相的修正可能会造成颜色的失真。
  • 色相的调整通常在H原始值上加上一个小的偏移量,使其在色相环上有小角度的调整。调整后,图像的色调会变为冷色或者暖色。

二、图像灰度化

1. 什么是图像灰度化

  • 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255.将RGB图像转换为灰度图像的过程称为图像灰度化处理。

2. 如何进行图像灰度化

  • 灰度化处理方法包括:

    • 分量法。将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
    • 最大值法。将彩色图像中的三分量宽度的最大值作为灰度图的灰度值。
    • 将彩色图像中的三分量亮度求平均得到一个灰度值。
    • 根据重要性及其它指标,将三个分量以不同的权值进行加权平均。例如,由于人眼对绿色的敏感最高,对蓝色敏感最低。因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。如:

三、二值化与反二值化

1. 二值化

  • 二值化阈值处理是将原始图像处理为仅有两个值的二值图像,对于灰度值大于阈值t的像素点,将其灰度值设定为最大值。对于灰度值小于或等于阈值t的像素点,将其灰度值设定为0。

2. 反二值化

  • 反二值化阈值处理的结果也是仅有两个值的二值图像,对于灰度值大于阈值的像素点,将其值设定为0;对于灰度值小于或等于阈值的像素点,将其值设定为255.

四、直方图均衡化处理

1. 图像直方图

  • 灰度直方图反映的是一幅图像中各灰度级像素出现的频率。以灰度级为横坐标,纵坐标为灰度级的频率,绘制频率同灰度级的关系图就是灰度直方图。它是图像的一个重要特征,反映了图像灰度分布的情况。
  • 使用直方图进行图像变换是一种基于概率论的处理方法,通过改变图像的直方图,修改图像中各像素的灰度值,达到增强图像视觉效果的目的。
  • 相对于灰度变化只针对单独的像素点操作,直方图变化综合考虑了全图的灰度值分布。
  • 下面是两幅灰度图像的直方图,直方图的形状能反映图像的视觉效果。
  • 对于彩色图像,可以对不同的通道分别统计直方图

2. 直方图均衡化

  • 直方图均衡化将原始图像的直方图,即灰度概率分布图,进行调整,使之变化为均衡分布的样式,达到灰度级均衡的效果,可以有效增强图像的整体对比度。
  • 直方图均衡化能够自动的计算变化函数,通过该方法自适应的产生有均衡直方图的输出图像。能够对图像过暗、过亮和细节不清晰的图像得到有效的增强。
  • 在常用的图像处理库中,直方图操作都有API直接调用实现。

第三章 OpenCV

一、OpenCV安装

  • 执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。
# 安装opencv核心库
pip3 install --user opencv-python==3.4.2.16 --index-url# 安装opencv贡献库
pip3 install --user opencv-contrib-python==3.4.2.16 --index-url

二、OpenCV使用

# 利用opencv实现图像读取、显示、保存import cv2im = cv2.imread("../data/Linus.png",  # 图像路径1)  # 1-彩色图像 0-灰度图像
print(type(im))  # 打印图像数据类型
print(im.shape)  # 打印图像数据的形状
# (216, 160, 3) 图像高度为216,宽度为16,通道为3
cv2.imshow("im", im)  # 显示图像,第一个参数名称不要重复
cv2.imwrite("../data/Linux_new.png") # 保存图像
cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口
# 彩色图像转换为灰度图像示例
import cv2
im = cv2.imread("../data/Linus.png", 1) # 读取彩色图像
cv2.imshow("im", im)# cvtColor函数转换为灰度图像
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("im_gray", im_gray)cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口

# 对图像某个通道进行操作
import cv2im = cv2.imread("../data/opencv2.png")
cv2.imshow("im", im)# 取出蓝色通道,并显示(单通道图像,所以显示成灰度图像)
b = im[:, :, 0]  # 0为第一个通道蓝色通道
cv2.imshow("b", b)# 抹掉蓝色通道(将蓝色通道全部置0)
im[:, :, 0] = 0
cv2.imshow("im-b0", im)# 抹掉绿色通道
im[:, :, 1] = 0
cv2.imshow("im-b0-g0", im)cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口

# 直方图均衡化处理:equalizeHist
import cv2
import numpy as np
from matplotlib import pyplot as pltim = cv2.imread("../data/sunrise.jpg", 0)  # 读取灰度图像
cv2.imshow("im", im)# 直方图均衡化处理
im_equ = cv2.equalizeHist(im)
cv2.imshow("im_equ", im_equ)# 绘制灰度直方图
# 原始图像直方图绘制
plt.subplot(2, 1, 1)
plt.hist(im.ravel(),  # 返回一个扁平的数组256, [0, 256], label="orig")
plt.legend()# 均衡化处理后的图像直方图绘制
plt.subplot(2, 1, 2)
plt.hist(im_equ.ravel(),256, [0, 256], label="equalized")
plt.legend()plt.show()cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口

# 彩色图像直方图均衡化处理
import cv2im = cv2.imread("../data/sunrise.jpg")
cv2.imshow("im", im)# BGR ==> YUV
yuv = cv2.cvtColor(im, cv2.COLOR_BGR2YUV)# 取出亮度通道,进行均衡化处理,并将均衡化处理后的值赋值回原图像
yuv[..., 0] = cv2.equalizeHist(yuv[..., 0])# YUV ==> BGR
equalized_color = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)cv2.imshow("equalized_color", equalized_color)cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口

# 图像二值化与反二值化处理
import cv2im = cv2.imread("../data/lena.jpg", 0) # 读取灰度图像
cv2.imshow("im", im)# 二值化
t, rst = cv2.threshold(im,127, # 阈值255, # 最大值cv2.THRESH_BINARY)    # 二值化
cv2.imshow("bin", rst)# 反二值化
t, rst2 = cv2.threshold(im,127, # 阈值255, # 最大值cv2.THRESH_BINARY_INV)    # 反二值化
cv2.imshow("bin_inv", rst2)cv2.waitKey()  # 等待用户按某个按键
cv2.destroyAllWindows()  # 销毁所有创建的窗口

【Python计算机视觉】Python全栈体系(二十三)相关推荐

  1. 乐学偶得《零基础Python入门编程全栈量化AI》课程238课的详细完整代码怎么样实现?靠谱答案来啦啦啦╭(╯^╰)╮

    学习打卡内容搬运于乐学偶得公众号:乐学Fintech ,仅用于我学习打卡之用.也在此和学习Python的小伙伴分享~ 我学习的是乐学偶得<零基础Python入门编程全栈量化AI>课程,属于 ...

  2. spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...

    SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件 一.概述 Spring Boot允许多种配置来源,官网是这样说的: Spring Boot使用一种非常特殊的Property ...

  3. 合肥python培训-合肥Python测试开发全栈核心课程

    从初级的手工测试到.顶端的测试开发,大家都希望能不断的进行技术的提升,而就目前的现状而言,在企业内部不愿意花费成本去进行高级人才的培养,企业更愿意花高薪招聘高级技术人才,而我们希望能够在工作中不断提升 ...

  4. python测试开发培训怎么样_合肥Python测试开发全栈核心课程

    从初级的手工测试到.顶端的测试开发,大家都希望能不断的进行技术的提升,而就目前的现状而言,在企业内部不愿意花费成本去进行高级人才的培养,企业更愿意花高薪招聘高级技术人才,而我们希望能够在工作中不断提升 ...

  5. 西安把python需要纳入课堂_西安Python测试开发全栈核心课程

    从初级的手工测试到.顶端的测试开发,大家都希望能不断的进行技术的提升,而就目前的现状而言,在企业内部不愿意花费成本去进行高级人才的培养,企业更愿意花高薪招聘高级技术人才,而我们希望能够在工作中不断提升 ...

  6. python小白到全栈_python全栈第八讲

    一.什么是函数 当我们在写代码时需要多次使用某段代码时,为避免代码重复,可将该段代码封装起来,哪里需要就在哪里调用这段代码,这段封装起来的代码就是函数. 函数是组织好的,可重复使用的,用来实现单一,或 ...

  7. 网易云课堂Python Flask框架全栈开发(200课全)

    适用人群 1.想使用Python快速开发网站的. 2.前端开发者,想学习后端开发逻辑的. 3.有编程经验,想学习Flask的. 课程概述 本套课程的目标是从零基础开始,使用Flask框架开发企业级的项 ...

  8. python全栈开发下载_网易云课堂Python Flask框架全栈开发,全套视频教程学习资料通过百度云网盘下载...

    适用人群 1.想使用Python快速开发网站的. 2.前端开发者,想学习后端开发逻辑的. 3.有编程经验,想学习Flask的. 课程概述 本套课程的目标是从零基础开始,使用Flask框架开发企业级的项 ...

  9. 慕课网python就业_python全栈开发慕课网

    前端 web框架: flask:简单.轻量.灵活性大 (官网,stck overflowa); 目录结构:配置,发布,资源,日志,测试... 前后端协作:整体发布,前后端分离发布 django:简单, ...

  10. 最新网易云课堂Python Flask框架全栈开发(完整版)

    适用人群 1.想使用Python快速开发网站的. 2.前端开发者,想学习后端开发逻辑的. 3.有编程经验,想学习Flask的. 课程概述 本套课程的目标是从零基础开始,使用Flask框架开发企业级的项 ...

最新文章

  1. tablib把数据导出为Excel、JSON、CSV等格式的Py库(写入数据并导出exl)
  2. 【Linux就该这么学 20期培训笔记 01】部署虚拟环境安装linux系统
  3. createsemaphore 异常_浅析SPC之异常分析
  4. 问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
  5. 如何设置Mosek的最大迭代次数?
  6. matlab四大取整函数fix,floor,ceil,round
  7. [CVE-2021-45105] Apache Log4j2 漏洞复现与原理详细分析
  8. pyspark 解决数据倾斜demo(两端聚合)(全网之最)
  9. 1:0 本立而道生!
  10. java面试题汇总 java面试题集合 - 网络收集
  11. qt几种常见的打包安装程序工具
  12. openGL库的简单配置
  13. 差分隐私-整理-知乎
  14. 有趣又漂亮的可视化图表制作
  15. Telnet服务配置
  16. Java实现简易计算器
  17. 软件设计师真题知识点(本人刷题笔记)
  18. Elasticsearch Date类型,时间存储相关说明
  19. sis、sisx文件解压 SISWare
  20. 创建Android定时器的5种方法

热门文章

  1. Python练手小项目(5)斐波那契数列及其曲线的绘制
  2. 基于Android的校园新闻APP
  3. RationalDMIS 检具的测量
  4. 最新美团商超/买药数据采集爬虫接口0326
  5. VBA Word ParagraphFormat.FirstLineIndent
  6. 网站被挂码被劫持的解决方法
  7. linux的补丁安装目录,为Ubuntu安装RT-Linux补丁
  8. maya贴图路径重新设定
  9. java怎么判断json是否为空_java判断jsonObject和jsonArray是否为空
  10. db2 linux 导入数据_linux导入db2数据库