书名:计算机视觉40例入门----作者:李立宗---链接计算机视觉40例从入门到深度学习(OpenCV-Python) - 李立宗 - 微信s

本书涵盖三方面内容--数字图像处理,python基础,OpenCV基础

 第一章:数字图像基础

1.1数据理解
  1. 人们擅长理解图像,计算机擅长理解数值。在处理图像时,我们要把图像转化为数值,再交给计算机来处理。(图像-->数值-->计算机处理-->数值-->图像)核心问题是如何处理图像对应的数据,前提是要知道怎么样把图像转化为数值(提取特征)
  2. 数字图像是由一个又一个的点构成的,这些点被称为像素。 计算机使用不同数值来表示不同颜色。如下图是一个二值图像(由64个像素点构成,该图像被存储到计算机中时,白色像素点存储为1,黑色像素点存储为0)

  • 表示一幅图像的像素点越多,图像呈现的细节信息越丰富,图像越逼真。衡量图像清晰度的重要标准被称为分辨率。(图像分辨率越高,单位面积内所含的像素点越多)
  • 灰度图-使用一个字节(8个二进制位)来表示一个像素点,8位的二进制数表示范围[0~255],用8位二进制数能够表示256种不同的颜色。在灰度图像中,0表示纯黑色,255表示纯白色。数值越小,灰度越深;数值越大,灰度越浅。
  • 在使用包含256个灰度级的8位位图来表示仅包含黑色和白色的二值图像时,用数值“255”表示白色,用数值“0”表示黑色。
  • 实践中,通常会将其他形式的图像(如灰度图像)处理为二值图像再进行运算。一方面是由于二值图像运算更简单方便,另一方面是由于二值图像能够保留原始图像(如灰度图像)中的重要特征信息。
  • 像素点的像素值的处理结果可能超过255,处理方式:1.取模处理(水表,挂钟)2.饱和处理,把越界的数值处理为最大值(截断处理)(汽车仪表盘)。
  • result=mod(ov,255)------ov为原始值,mod(a,b)表示将a对b取模。
  • 饱和处理
  • 像素点的索引表示
  •  OpenCV中的图像坐标
  • 左上方位置的某个像素点的RGB值为(67,3,81)​,需要注意的是,表示该像素点的三个像素值并没有存放在一起,而是分别存储在R通道、G通道、B通道内的。
  • 曼哈顿距离:|x2-x1|+|y2-y1|=线X+线Y。
  • 图搜索功能
  • 图像识别原理基本一致,通过特征提取模块分别完成待识别图像和已知图像的特征提取。分别计算待识别图像与各个已知图像之间的距离。将最小距离值对应的已知图像作为识别结果。
  • 图像处理过程中特征提取是非常关键的步骤。
  • 传统方法的特点是,需要提取图像的特征,并手动对特征进行分析、处理。在对特征进行分析、处理的过程中,距离的计算是非常关键的。为实现图像的分类、识别等,人们提出了很多距离计算方式。为了更高效地处理图像,人们引入了机器学习。机器学习方法的首要工作仍是进行特征的提取和量化,但机器学习提供了更多对特征值进行处理的方式,让我们能够根据需要对特征进行不同维度的分析、处理,从而得到对图像的分析处理结果。
  • 也就是说,在传统方式中,我们需要自己提取特征,然后选取一种有效的特征处理方式,如通过计算距离并对比结果等完成对特征的处理工作。而在机器学习中,我们要做的工作只是提取特征,在提取完特征后,直接把特征交给机器学习算法来处理即可。
  • 机器学习让我们只需关注特征提取,无须关注如何处理特征,与传统图像处理方式相比,工作量减少了一半。
  • 特征提取其实是一件非常困难的事(1.如何选取特征,2.如何处理特征)
  • 在深度学习中,不需要直接提取特征,而是通过卷积操作等提取图像的高层次特征,这些特征往往能够更清晰地表述图像的高层语义,甚至有可能包含我们不能直接理解或观察到的特征。
  • 我们重点关注卷积操作,通过变换卷积操作提取不同特征。通过卷积操作,可以提取到图像的高层次特征,利用这些特征可以更好地进行图像分析与处理。
  • 识别图像内的猫时,直接提取特征提取的可能是线条、边角等基础特征。而在深度学习中,通过卷积可以提取猫所特有的形态、外观、姿势等高层次特征,甚至可能包含不能被观察到的、尚未被掌握的,甚至不能理解的更高层次、更抽象的特征
  • 现代编程的核心是“抽象”​,类似于键盘、Photoshop的设计,会把要实现的某些非常复杂的功能封装起来,构成函数。在实现相应功能时,只需要调用函数就可以了,不需要再把程序从头到尾写一遍。
  • 函数集合(库、模块、包),通常情况下,只需要把要处理的图像传递给库函数,它就能把处理结果返回给我们。
  • 图像处理领域有非常多的高质量库。其中,OpenCV的影响力最大、应用最广。OpenCV提供了机器学习模块用以实现机器学习功能,提供了DNN(Deep Neural Networks,深度神经网络)模块用以实现深度学习功能。
  • 人脸识别领域中,可以借助dlib库中关于人脸识别的部分实现易容术、驾驶员疲劳检测、面部表情识别、性别和年龄识别等。
  • 在使用库函数完成图像处理任务时,只需把符合要求的输入作为参数传递给库函数即可得到想要的处理结果。
  • 我们可以将这些函数称为“黑盒”​,无须关注其内部的构造也能够正常使用它。但为了更好地使用函数,我们有必要了解该函数是如何设计构造的。当我们打开函数,理解函数的具体实现时,函数对于我们来说就是个“白盒”​。
  • 实践中,我们要控制好“白盒”和“黑盒”的平衡。既要掌握库函数的使用方法,也要掌握一定的函数实现涉及的算法原理。

 第二章:python基础

  • 模块是函数的集合,可满足特定的需求和目的,如方便网络访问、方便加密处理、方便数学计算、方便数据处理、方便图像处理等。通常使用“import模块名”语句将模块导入程序
  • Python中常用的标准模块
  1. ● random模块:提供可进行随机选择的函数。
  2. ● os模块:提供与操作系统交互的函数。
  3. ● sys模块:提供与系统相关的参数和函数。
  4. ● time模块:提供与时间相关的函数。
  5. ● math模块:提供对浮点数学的底层C库函数的访问。
  6. ● re模块:为高级字符串处理提供正则表达式的工具。
  • 在使用第三方模块前,需要先对其进行下载和安装,然后就可以像使用标准模块一样导入并使用了。pip install 第三方模块名。安装用于科学计算的NumPy模块pip install numpy.
  • 第三方模块
  1. ● NumPy:该模块用于实现科学计算,其提供的数组功能可以非常方便地处理图像。
  2. ● OpenCV:高效的图像处理模块是重点
  3. ● dlib:包含很多机器学习算法,使用起来简单方便。
  4. ● matplotlib.pyplot:该模块提供了类似于MATLAB的界面,使用简单的程序即可实现高效的绘图功能

第三章:OpenCV基础

  • opencv是一个开源的计算机视觉库,包含500多个函数。--《OpenCV轻松入门—面向Python》
  • pip install opencv-python---Successfully installed opencv-python-版本号
  • 可以在Anaconda Prompt内使用“conda list”语句查看安装是否成功。如果安装成功,那么将会显示安装成功的OpenCV库及对应的版本等信息。OpenCV的很多新功能被放在贡献包内,因此在安装好OpenCV的同时要安装好贡献包。可以使用pip语句完成贡献包的安装。
  • cv2.imread()来读取图像----retval=cv2.imread(filename ,[flags]),retval=None表示未读取到图像,filename是要读取图像的完整文件名字。flags用来控制读取文件的类型。
  • 若想读取当前目录下文件名为lena.bmp的图像,并保持原有格式读入,则可以使用的语句为lenacv.imread("lena.bmp",-1)。上述程序要想正确运行,需要先导入cv2模块,大多数常用的OpenCV函数都在cv2模块内
  • cv2模块内采用的是面向对象的编程方式,而cv模块内更多采用的是面向过程的编程方式
  • cv2.imshow(winname,mat)--用来显示图像。函数cv2.waitKey()用来等待按键,当用户按下按键后,该语句会被执行,并获取返回值。retval=cv2.waitkey([delay])。函数cv2.destroyAllWindows()用来释放(销毁)所有窗口,None=cv2.destroyAllWindows()
  • 函数cv2.imwrite()来保存图像,retval=cv2.imwrite(filename,img,[param])(保存成功返回True。
  • np.array库是Python处理图像的基础
  • 像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过索引对图像内的元素进行访问和处理。
  • 图像理解为一个矩阵,在面向Python的OpenCV中,图像就是NumPy库中的数组(numpy.ndarray)​,一个灰度图像是一个二维数组,可以通过索引访问其中的像素值。
  • 例如,可以使用image[0,0]访问图像image第0行第0列位置上的像素点。
  • OpenCV在处理RGB模式的彩色图像时,会按照行方向依次分别读取该RGB图像像素点的B通道、G通道、R通道的像素值,并将像素值以行为单位存储在ndarray的列中。
  • image[0,0,0]访问image图像B通道内第0行第0列上的像素点。 
  • img[0,0,0]​:访问img图像第0行第0列第0个通道的像素值,由于图像是BGR格式的,所以第0个通道是B通道。
  •  img[0,0,1]​:访问img图像第0行第0列第1个通道的像素值,由于图像是BGR格式的,所以第1个通道是G通道,会得到G通道内第0行第0列的位置对应的像素值0。
  • ● img[0,0,2]​:访问img图像第0行第0列第2个通道的像素值,由于图像是BGR格式的,所以第2个通道是R通道,会得到R通道内第0行第0列的位置对应的像素值255。
  • RGB图像是由R通道、G通道、B通道三个通道构成的。需要注意的是,OpenCV中的通道是按照B通道→G通道→R通道的顺序存储的。在图像处理过程中,可以根据需要对通道进行拆分和合并。
  • 可用如下语句分别从中提取B通道、G通道、R通道:
  • ● 语句lena[​:​,​:​,0]=0将图像img的B通道值设置为0。
  • ● 语句lena[​:​,​:​,1]=0将图像img的G通道值设置为0。
  • 可以使用函数cv2.split()来拆分图像的通道。
  • 函数cv2.merge()可以实现通道合并。
import numpy
import cv2 as cv
import matplotlib.pyplot as plt

#1.读取图像
img=cv.imread("image/dingxiao.jpg")

#2.显示图像
#2.1 opencv
cv.imshow('dingxiao',img)
b=img[:,:,0]
g=img[:,:,1]
r=img[:,:,2]
cv.imshow("b",b)
cv.imshow("g",g)
cv.imshow("r",r)
img[:,:,0]=0
cv.imshow("imgb0",img)
img[:,:,1]=0
cv.imshow("imgb0g0",img)
cv.waitKey(0)
cv.destroyAllWindows()
  • cv2.resize()实现对图像的缩放
  • ● dst代表输出的目标图像。● src代表需要缩放的原始图像。● dsize代表输出图像大小。● fx代表水平方向的缩放比例。● fy代表垂直方向的缩放比例。● interpolation代表插值方式。
  • 插值方式
  •  插值是指在对图像进行几何处理时,为无法直接通过映射得到像素值的像素点赋值。
  • 感兴趣区域(Region of Interest,ROI),在设定ROI后,可以对该区域进行整体操作。
  • 既可以表述为第200行到第400行,与第200列到第400列的交叉区域,又可以表述为第200行到第399行与第200列到第399列的交叉区域。
  • 图像掩模是指,用选定的图像、图形或物体遮挡待处理的图像(全部或局部)​,从而控制图像处理的区域。
  • 掩膜处理
  • 在传统的光学图像处理中,掩模可能是胶片、滤光片等实物。在数字图像处理中,掩模为一个指定的数组。
  • 掩模在图像处理实践中的功能:
  • ● ROI的提取:使用掩模与原始图像进行计算,可以提取掩模指定的特定区域,将其余区域置为白色(数值0)或者黑色(数值255)​。
  • ● 屏蔽作用:仅让掩模指定的区域参与运算。
  • ● 结构特征提取:用图像匹配方法检测和提取图像中与掩模相似的结构特征。
  • 图像平滑处理是指在一幅图像中若一个像素点与周围像素点的像素值差异较大,则将其值调整为周围邻近像素点像素值的近似值(如均值等)。
  • 平滑图像针对图像内的每一个像素点都进行上述平滑处理就能够完成整幅图像的平滑处理,有效地去除图像内的噪声信息。
  • 均值滤波时,首先要考虑需要对周围多少个像素点取平均值,通常情况下,会以当前像素点为中心,求行数和列数相等的一块区域内的所有像素点的像素值的平均值。新值=[​(197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75)​]/25=126。将126作为当前像素点均值滤波后的像素值,即可得到当前图像的均值滤波结果。
  • 图像的边界点的处理当前像素点的均值滤波计算方法为新值=[​(23+158+140)+(238+0+67)+(199+197+25)​]/9=116。
  • 将该像素点的5×5邻域像素值与一个内部值都是1/25的5×5矩阵相乘,得到均值滤波的结果126
  •  
  • 在OpenCV中,图右侧的矩阵被称为卷积核,其一般形式为
  • 卷积核越大,参与均值运算的像素点越多,即当前像素点计算的是周围更多点的像素点的像素值的均值。因此,卷积核越大,去噪效果越好,花费的计算时间越长,图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。
  • 在高斯滤波中,卷积核中的值不再相等。一个3×3高斯滤波卷积核示例如图高斯卷积
  • 实际使用的卷积。新值=(40×0.05+107×0.1+5×0.05)+(198×0.1+226×0.4+223×0.1)+(37×0.05+68×0.1+193×0.05)=164
  • OpenCV实现高斯滤波的函数是cv2.GaussianBlur()
  • 中值滤波会取当前像素点及其周围邻近像素点(通常取奇数个像素点,类似于董事会设置奇数个成员,以免出现平局,方便判断投票结果)的像素值。
  • 按升序排序后得到序列值为[66,78,90,91,93,94,95,97,101]​。在该序列中,处于中心位置(也叫中心点或中值点)的值是“93”​,用该值作为新像素值替换原来的像素值78
  • 中值滤波的函数是cv2.medianBlur()
  • 形态学主要从图像内提取分量信息,该分量信息通常是图像理解时所使用的最本质的形状特征,对于表达和描绘图像的形状具有重要意义。例如,在识别手写数字时,通过形态学运算能够得到其骨架信息,在具体识别时仅针对其骨架进行运算即可形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域有非常重要的应用。
  • 腐蚀是最基本的形态学操作之一,能够消除图像的边界点,使图像沿着边界向内收缩,也可以去除小于指定结构元的部分

。。。。。。膨胀。。通用形态学函数

第四章:图像的加密与解密

  • 通过按位异或运算可以实现图像的加密和解密。将原始图像与密钥图像进行按位异或可以实现加密;将加密后的图像与密钥图像进行按位异或可以实现解密
  • 异或运算(相同为0不同为1)

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐