# opencv_study **Repository Path**: linlin2018/opencv_study ## Basic Information - **Project Name**: opencv_study - **Description**: 贾志刚老师录制了30课时的OPenCV4 python版本的免费视频,在B站 提供给大家免费学习,需要直接点击下面地址即可 OpenCV4.x python快速入门视频教程 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-04-19 - **Last Updated**: 2024-04-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # about ## 黑马 跟着黑马的视频敲的笔记: https://www.bilibili.com/video/BV1Fo4y1d7JL [heima_opencv_notes](heima_opencv_notes)为黑马老师自己整理的笔记。 ## quick_tutorial [quick_tutorial](quick_tutorial)目录为跟着贾志刚老师的课程边学边敲。 贾志刚老师录制了30课时的OPenCV4 python版本的免费视频,在B站 提供给大家免费学习,需要直接点击下面地址即可 OpenCV4.x python快速入门视频教程 https://www.bilibili.com/video/BV1hM4y1M7vQ # 图像处理简介 ## 灰度图像 ● 灰度图像是由灰度级组成的图像,每个像素的灰度级表示图像中的亮度。通常,灰度级在0到255之间,其中0表示黑色,255表示白色。 ● 在灰度图像中,每个像素都有一个单一的数值,表示该像素的亮度。因此,灰度图像是单通道图像。 ## 二值图像 不是黑就是白 二值图像是一种特殊的灰度图像,其中每个像素只能取两个值,通常是0或1。这两个值通常分别代表黑色和白色,或者表示某种特定的目标和背景。 ## 彩色图 彩色图像是一种图像表示方式,它包含了多个颜色通道的信息,相对于灰度图像而言,彩色图像能够更真实地表达物体的颜色。彩色图像通常用于涉及色彩信息的图像处理、计算机视觉和图形学等领域。 常见的彩色图像有三种基本颜色通道,即红色(R,代表Red)、绿色(G,代表Green)、蓝色(B,代表Blue),这种颜色模型被称为RGB颜色模型。在RGB颜色模型中,每个像素由这三个颜色通道的数值组成,形成一个三维的颜色空间。通过不同的组合,可以生成各种颜色。 除了RGB颜色模型,还有其他颜色模型,如CMYK(青、品红、黄、黑)用于印刷领域,HSV(色调、饱和度、明度)用于颜色的直观表示等。 彩色图像相对于灰度图像具有更丰富的信息,可以提供更多关于场景的细节,这对于许多应用是至关重要的。在计算机视觉任务中,彩色信息通常用于物体识别、图像分割等,而在图形学中,彩色图像则用于渲染真实感图像。 # opencv 介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了许多用于图像处理和计算机视觉的功能和工具。以下是一些常见的OpenCV模块: 1. **Core 模块(core)**:提供基本的数据结构、算法和功能,如图像的读取、写入、操作等。 2. **Imgproc 模块(imgproc)**:包含图像处理函数,如图像平滑、边缘检测、图像变换等。 3. **HighGUI 模块(highgui)**:用于创建简单的用户界面,包括图像显示窗口、滑动条等。 4. **Video 模块(video)**:包含视频处理相关的功能,如视频捕捉、视频编解码等。 5. **Calib3d 模块(calib3d)**:用于相机标定、三维重建和相机姿态估计等计算机视觉任务。 6. **Features2d 模块(features2d)**:提供了特征检测和描述子提取的函数,如SIFT、SURF、ORB等。 7. **Objdetect 模块(objdetect)**:包含用于目标检测的功能,如Haar级联分类器。 8. **Videoio 模块(videoio)**:用于读写视频文件和摄像头数据的功能。 9. **ML 模块(ml)**:提供机器学习相关的功能,包括支持向量机(SVM)和k最近邻(k-NN)等。 10. **Flann 模块(flann)**:用于快速最近邻搜索的库。 11. **Dnn 模块(dnn)**:包含深度学习模型的功能,可以用于加载和运行深度学习模型。 12. **Photo 模块(photo)**:提供了一些图像编辑和修复的工具,如色彩校正和图像修复。 13. **Stitching 模块(stitching)**:用于图像拼接和全景图像创建的功能。 14. **Shape 模块(shape)**:包含形状分析和匹配的函数。 # 图像基础操作 ## 图像读取与显示 ```python import cv2 as cv # 以灰度图的形式读取图像 img = cv.imread('../images/test.jpg',0) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows() ``` 读取方式的标志 cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。 cv.IMREAD*GRAYSCALE:以灰度模式加载图像 cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。 **可以使用1、0或者-1来替代上面三个标志** ## 绘制几何图形 cv.line(): 绘制直线 cv.circle(): 绘制圆形 cv.rectangle(): 绘制矩形 cv.putText(): 在图像上添加文字 ```python import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 创建一个空白的图像 img = np.zeros((512,512,3), np.uint8) # 2 绘制图形 cv.line(img,(0,0),(511,511),(255,0,0),5) cv.rectangle(img,(384,0),(510,128),(0,255,0),3) cv.circle(img,(447,63), 63, (0,0,255), -1) font = cv.FONT_HERSHEY_SIMPLEX cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA) # 3 图像展示 plt.imshow(img[:,:,::-1]) plt.title('匹配结果'), plt.xticks([]), plt.yticks([]) plt.show() ``` ## 图像的属性 ![img.png](images%2Fimg.png) ## 其他操作 直接使用行列索引获取图像中的像素并进行修改 拆分通道:cv.split() 通道合并:cv.merge() 色彩空间的改变: cv.cvtColor(input_image,flag) ## 算数操作 ### 加法 你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。 _**注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。**_ **_注意:这里都要求两幅图像是相同大小的。_** 参考以下代码: ``` >>> x = np.uint8([250]) >>> y = np.uint8([10]) >>> print( cv.add(x,y) ) # 250+10 = 260 => 255 [[255]] >>> print( x+y ) # 250+10 = 260 % 256 = 4 [4] ``` ### 混合 将两幅图像按照不同的比例进行混合 注意:这里都要求两幅图像是相同大小的。 ```commandline import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 读取图像 img1 = cv.imread("view.jpg") img2 = cv.imread("rain.jpg") # 2 图像混合 img3 = cv.addWeighted(img1,0.7,img2,0.3,0) # 3 图像显示 plt.figure(figsize=(8,8)) plt.imshow(img3[:,:,::-1]) plt.show() ``` ## 图像色彩空间转换 cvtColor()函数是opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换成灰度图像。 HSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。 这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°; 饱和度S:取值范围为0.0~1.0; 亮度V:取值范围为0.0(黑色)~1.0(白色)。 ```python def color_space_demo(): image = cv.imread("../images/test.jpg") gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #将加载的彩色图像转换为灰度图像 hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) #将加载的彩色图像转换为HSV颜色空间 cv.imshow("gray",gray) cv.imshow("hsv",hsv) cv.waitKey(0) cv.destroyAllWindows() if __name__ == '__main__': color_space_demo() ``` # 一些基础概念 ## HSV颜色空间 HSV颜色空间是一种用于表示颜色的方式,它使用三个参数来描述一个颜色:色相(Hue)、饱和度(Saturation)和明度(Value)。HSV颜色空间在某些图像处理和计算机视觉任务中非常有用,因为它更符合人类感知颜色的方式,相对于RGB颜色空间,它更容易理解和控制颜色。 下面是HSV颜色空间的三个参数的解释: 1. 色相(Hue,H):色相表示颜色的类型,即颜色的名称(如红色、蓝色、绿色等)。在HSV颜色空间中,色相的取值范围是0到360度,其中0度对应红色,120度对应绿色,240度对应蓝色,以此类推。色相值的改变会导致颜色的变化,而不会影响亮度和饱和度。 2. 饱和度(Saturation,S):饱和度表示颜色的鲜艳程度或纯度。饱和度为0表示灰度图像,而饱和度为100%表示颜色的最高饱和度。降低饱和度会使颜色看起来更灰暗,增加饱和度会使颜色更加鲜艳。 3. 明度(Value,V):明度表示颜色的亮度或明亮程度。明度的取值范围是0到100%。较高的明度值表示颜色更亮,而较低的明度值表示颜色更暗。 在图像处理中,将图像转换为HSV颜色空间可以使颜色的分析、分割和调整更容易,因为它允许分别处理颜色的不同特性。例如,您可以轻松地通过修改色相通道来改变图像的颜色,通过调整饱和度通道来增加或减少颜色的饱和度,通过修改明度通道来调整图像的亮度。这对于颜色校正、颜色过滤和物体检测等应用非常有用。 ## 直方图 直方图(Histogram)是一种图形表达方式,用于表示数据的分布情况。在图像处理和计算机视觉中,直方图通常用于表示图像的像素值分布。 对于图像直方图,横轴表示像素值,纵轴表示对应像素值的数量或频率。直方图可以帮助我们直观地了解图像中像素值的分布情况,进而在图像处理任务中提供有用的信息。以下是直方图的一些常见应用: 1. **图像亮度分布:** 直方图可以显示图像中亮度水平的分布情况。通过观察直方图,可以了解图像中的亮度范围,帮助调整图像的对比度和亮度。 2. **图像对比度调整:** 直方图的横轴代表像素值,通过调整直方图的形状,可以改变图像的对比度。例如,拉伸直方图可以增强对比度,压缩直方图可以减少对比度。 3. **图像增强:** 通过直方图均衡化等技术,可以使直方图更均匀,从而增强图像的细节和视觉效果。 4. **阈值选择:** 通过观察直方图,可以选择合适的阈值来进行图像二值化,将图像分成目标和背景两部分。 下图是一维直方图(1D)和二维直方图(2D)之间的区别: | 方面 | 1D直方图 | 2D直方图 | |---------------------|------------------------------------|------------------------------------| | 维度 | 表示数据的一维分布 | 表示数据的二维分布 | | 变量 | 表示单一变量 | 表示两个相关变量 | | 应用 | 通常用于分析单一变量的分布(例如,灰度级强度) | 用于分析两个变量之间的关系(例如,颜色空间组件) | | 示例 | 图像中灰度级分布的直方图 | 图像中颜色分布的直方图(例如,色调-饱和度直方图) | | 图像处理中的应用 | 调整对比度、亮度,或进行灰度级分析 | 分析图像中颜色的分布和关联性 | ## 直方图均衡化 直方图均衡化是一种图像处理技术,旨在增强图像的对比度。通过直方图均衡化,我们可以使图像的灰度级分布更均匀,从而提高图像的视觉效果。这个过程通过重新分配图像的像素值,使得原始图像中较暗或较亮的区域在均衡化后能够更广泛地覆盖整个灰度范围。 直方图均衡化的主要优点是它可以增强图像中细节的对比度,特别是在原始图像中存在相对较暗或较亮区域的情况下。然而,它可能会导致在图像中某些区域细节的丧失,因为它是全局性的调整。在一些情况下,人们可能会选择自适应直方图均衡化方法,以更好地适应图像的局部特性。 直方图均衡化的基本步骤如下: 1. **计算原始图像的灰度直方图:** 统计图像中每个灰度级别的像素数量。 2. **计算累积分布函数(CDF):** 将灰度直方图转换为累积分布函数,表示每个灰度级别的累积像素比例。 3. **映射新的像素值:** 将原始图像中的每个像素值替换为CDF的值,这样就实现了对原始图像灰度分布的均衡化。 4. **生成均衡化后的图像:** 使用映射后的像素值生成均衡化后的图像。