type
status
date
slug
summary
tags
category
icon
password
😀
OpenCV可以应用但不仅限于以下场景:二维和三维特征提取、街景图像拼接、人脸识别系统、手势识别、人机交互、动作识别、物体识别、自动检查和监视、分割与识别、医学图像分析、运动跟踪、增强现实、视频/图像搜索与检索、机器人与无人驾驶汽车导航与控制、驾驶员疲劳驾驶检测等。
 

📝 图像处理基础

1.0基础知识

图像处理中的主要问题

我们看可以把图像看作是三维世界的二维视图,那么数字图像作为2D图像,可以使用称为像素的有限数字集进行表示(像素的概念将在像素、颜色、通道、图像和颜色空间部分中详细解释)。我们可以,将计算机视觉的目标定义为将这些2D数据转换为以下内容:
  • 新的数据表示(例如,新图像)
  • 决策目标(例如,执行具体决策任务)
  • 目标结果(例如,图像的分类)
  • 信息提取(例如,目标检测)
 
在进行图像处理时,经常会遇到以下问题:
1.图像的模糊性,由于受到透视的影响,从而会导致图像视觉外观的变化。例如,从不同的角度看同一个物体会产生不同的图像;
2.图像通常会受许多自然因素的影响,如光照、天气、反射和运动;
3.图像中的一部分对象也可能会被其他对象遮挡,使得被遮挡的对象难以检测或分类。随着遮挡程度的增加,图像处理的任务(例如,图像分类)可能非常具有挑战性。
为了更好的解释上述问题,我们假设需要开发一个人脸检测系统。该系统应足够鲁棒,以应对光照或天气条件的变化;此外,该系统应该可以处理头部的运动——用户头部可以在坐标系中每个轴上进行一定程度的动作(抬头、摇头和低头,用户可以离相机稍近或稍远的情况)。而许多人脸检测算法在人脸接近正面时表现出良好的性能,但是,如果一张脸不是正面的(例如,侧面对着镜头),算法就无法检测到它。此外,算法需要即使在用户戴着眼镜或太阳镜时,也可能需要检测面部(即使这会在眼睛区域产生遮挡)。综上所述,当开发一个计算机视觉项目时,我们必须综合考虑到所有这些因素,一个很好的表征方法是有使用大量测试图像来验证算法。我们也可以根据测试图像的不同困难程度来对它们进行分类,以便于检测算法的弱点,提高算法的鲁棒性。

图像处理流程

完整的图像处理程序通常可以分为以下三个步骤:
1.读取图像,图像的获取可以有多种不同的来源(相机、视频流、磁盘、在线资源),因此图像的读取可能涉及多个函数,以便可以从不同的来源读取图像;
2.图像处理,通过应用图像处理技术来处理图像,以实现所需的功能(例如,检测图像中的猫);
3.显示结果,将图像处理完成后的结果以人类可读的方式进行呈现(例如,在图像中绘制边界框,有时也可能需要将其保存到磁盘)。
 
此外,上述第2步图像处理可以进一步分为三个不同的处理级别:
1.低层处理(或者在不引起歧义的情况下可以称为预处理),通常将一个图像作为输入,然后输出另一个图像。可在此步骤中应用的步骤包括但不限于以下方法:噪声消除、图像锐化、光照归一化以及透视校正等;
2.中层处理:是将预处理后的图像提取其主要特征(例如采用 DNN 模型得到的图像特征),输出某种形式的图像表示,它提取了用于图像进一步处理的主要特征。
3.高层处理:接受中层处理得到的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸.
 

像素、颜色、通道、图像和颜色空间

在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝 (RGB) 模型。RGB
模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B) 混合在一起就可以用来表示广泛的颜色范围。
每个原色 (R, G, B) 通常表示一个通道,其取值范围为[0, 255]内的整数值。因此,每个通道有共256个可能的离散值,其对应于用于表示颜色通道值的总比特数 (2^8=256)。此外,由于有三个不同的通道,使用 RGB 模型表示的图像称为24位色深图像。

图像描述

图像文件类型

OpenCV中的坐标系

OpenCV中的通道顺序:在OpenCV中,使用的颜色通道顺序为BGR颜色格式而不是RGB颜色格式。

1.1加载图像:cv2.imread()

该函数用于读取图片文件,通过返回值返回一个BGR格式的图像对象,其类型为一个numpy数组。
注:图片文件名不能是中文名,否则识别会报错或不能读入;

1.1.1加载彩色图像

image = cv2.imread('sigonghuiye.jpeg')

1.1.2加载灰度图像

gray_img = cv2.imread('logo.png', cv2.IMREAD_GRAYSCALE)

1.2分割加载图像的颜色通道:cv2.split()

b, g, r = cv2.split(image)

1.2.1使用NumPy索引获取通道

使用cv2.split(image)是一项耗时的操作。如果确实需要划分不同通道,应当先考虑使用NumPy索引。例如,如果想获得图像的一个通道,则可以使用NumPy索引获取通道:
B = image[:, :, 0] G = image[:, :, 1] R = image[:, :, 2]

1.2.2使用NumPy在一条语句中将图像从BGR转换为RGB

另一个需要注意的是,可以使用NumPy在一条语句中将图像从BGR转换为RGB: img_matplotlib = image[:, :, ::-1]

1.3合并通道:

采用RGB格式合并通道:
img_matplotlib = cv2.merge([r, g, b])

1.4显示图像:

cv2.imshow('bgr image', image) cv2.imshow('rgb image', img_matplotlib)

1.5键盘绑定函数:

cv2.waitKey() 它为任何键盘事件等待指定的毫秒数。参数是以毫秒为单位的时间。当执行此函数时,程序将暂停执行,当按下任何键后,程序将继续执行。如果毫秒数为0,它将无限期地等待键盘敲击事件。

1.5关闭并释放所有窗口

需要使用cv2.destroyAllWindows()函数。

1.6访问和操作彩色图像的像素:

dimensions = image.shape #shape告诉我们列、行和通道的数量(如果图像是彩色的) total_number_of_elements= image.size #size=图像高度图像宽度图像通道数 image_dtype = image.dtype #dtype即图像数据类型。因为像素值在[0, 255]范围内,所以图像数据类型是uint8(unsigned char)

1.6.1访问某个像素:

我们需要向image变量(包含加载的图像)提供所需像素的行和列,例如,要获得(x=40,y=6)处的像素值: (b, g, r) = image[6, 40] 我们在三个变量(b, g, r)中存储了三个像素值。请牢记OpenCV对彩色图像使用BGR格式。

1.6.2一次仅访问一个通道。

在本例中,我们将使用所需通道的行、列和索引进行索引。例如,要仅获取像素(x=40,y=6)处的蓝色值: b = img[6, 40, 0]

1.6.3像素值也可以以相同的方式进行修改。

例如,要将像素(x=40,y=6)处设置为红色: image[6, 40] = (0 ,0, 255)

1.6.4有时,需要处理某个区域而不是一个像素。

在这种情况下,应该提供值的范围(也称切片),而不是单个值。例如:要获取图像的左上角: top_left_corcer = img[0:50, 0:50] 变量top_left_corcer可以看做是另一个图像(比img小),但是我们可以用同样的方法处理它
 

1.7示例代码:

 
 

🤗 总结归纳

在本文中,首先介绍了与图像相关的关键概念。图像构成了构建计算机视觉项目所必需的丰富信息。然后,我们需要了解 OpenCV 使用 BGR 颜色格式而不是 RGB,但有一些 Python 包(例如 Matplotlib )使用后一种格式。因此,需要了解如何将图像从一种颜色格式转换为另一种颜色格式。
此外,还总结了处理图像的主要函数和参数:
1.访问图像属性
2.OpenCV 常用函数,例如 cv2.imread()、cv2.split()、cv2.merge()、cv2.imshow()、cv2.waitKey()和cv2.destroyAllWindows()
3.如何在 BGR 和灰度图像中获取和操作图像像素

📎 参考文章

  • 一些引用
  • 引用文章
 
💡
有关OpenCV安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
OpenCV-Python学习笔记02-OpenCV图像与视频文件处理
  • Giscus
  • Cusdis
  • Utterance
Naipings
Naipings
一个普通的大学生,分享自己学习的“有趣”知识
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉 感谢您的支持 🎉
-- 点击收藏不迷路 ---
👏欢迎更新体验👏