• OpenCV学习笔记


    1.图像的分类

    ⼆值图像:

    二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。

    二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。

    灰度图:

    灰度图,Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。

    彩⾊图:

    彩色图像是指每个像素由R、G、B分量构成的图像,其中R、G、B是由不同的灰度级来描述的。每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像与索引图像⼀样都可以⽤来表示彩⾊图像。与索引图像⼀样,它分别⽤红(R)、绿(G)、蓝(B)三原⾊的组合来表示每个像素的颜⾊。但与索引图像不同的是,RGB图像每⼀个像素的颜⾊值(由RGB三原⾊表示)直接存放在图像矩阵中,由于每⼀像素的颜⾊需由R、G、B三个分量来表示,M、N分别表示图像的⾏列数,三个M x N的⼆维矩阵分别表示各个像素的R、G、B三个
    颜⾊分量。RGB图像的数据类型⼀般为8位⽆符号整形,通常⽤于表示和存放真彩⾊图像。

    2.OpenCV安装方法

    安装OpenCV之前需要先安装numpy, matplotlib

    先安装OpenCV-Python, 由于⼀些经典的算法被申请了版权,新版本有很⼤的限
    制,所以选⽤3.4.3以下的版本

    pip install opencv-python==3.4.2.17

    现在可以测试下是否安装成功,运⾏以下代码⽆报错则说明安装成功。

    1. import cv2
    2. # 读⼀个图⽚并进⾏显示(图⽚路径需⾃⼰指定)
    3. lena=cv2.imread("1.jpg")
    4. cv2.imshow("image",lena)
    5. cv2.waitKey(0)

    如果我们要利⽤SIFT和SURF等进⾏特征提取时,还需要安装:

    pip install opencv-contrib-python==3.4.2.17

    3.OpenCV的模块 

     其中core、highgui、imgproc是最基础的模块,该课程主要是围绕这⼏个模块展开
    的,分别介绍如下:
    core模块实现了最核⼼的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
    highgui模块实现了视频与图像的读取、显示、存储等接⼝。
    imgproc模块实现了图像处理的基础⽅法,包括图像滤波、图像的⼏何变换、平滑、阈值分割、形态学处理、边缘检测、⽬标检测、运动分析和对象跟踪等。
    对于图像处理其他更⾼层次的⽅向及应⽤,OpenCV也有相关的模块实现features2d模块⽤于提取图像特征以及特征匹配,nonfree模块实现了⼀些专利算法,如sift特征。
    objdetect模块实现了⼀些⽬标检测的功能,经典的基于Haar、LBP特征的⼈脸检测,基于HOG的⾏⼈、汽⻋等⽬标检测,分类器使⽤Cascade Classification(级联分类)和Latent SVM等。
    stitching模块实现了图像拼接功能。
    FLANN模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜FLANN 和聚类Clustering算法。
    ml模块机器学习模块(SVM,决策树,Boosting等等)。
    photo模块包含图像修复和图像去噪两部分。
    video模块针对视频处理,如背景分离,前景检测、对象跟踪等。

    calib3d模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建
    相关的内容。包含了基本的多视⻆⼏何算法,单个⽴体摄像头标定,物体姿态
    估计,⽴体相似性算法,3D信息的重建等等。
    G-API模块包含超⾼效的图像处理pipeline引擎

    4.OpenCV基本操作

    4.1 读取图像

    cv.imread()

    参数:

    • 要读取的图像
    • 读取⽅式的标志

                    cv.IMREAD*COLOR:以彩⾊模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
                    cv.IMREAD*GRAYSCALE:以灰度模式加载图像
                    cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。可以使⽤1、0或者-1来替代上⾯三个标志

    4.2 显示图像

    cv.imshow()

    参数:

    • 显示图像的窗⼝名称,以字符串类型表示
    • 要加载的图像

    注意:在调⽤显示图像的API后,要调⽤cv.waitKey()给图像绘制留下时间,否则
    窗⼝会出现⽆响应情况,并且图像⽆法显示出来。

    另外我们也可使⽤matplotlib对图像进⾏展示。

    1. import cv2 as cv
    2. #读取
    3. img = cv.imread("image_01.jpg")
    4. #显示
    5. cv.imshow("image",img)
    6. #写入
    7. cv.imwrite("1.jpg",img)
    8. cv.waitKey(0)

    plt显示

    1. import cv2 as cv
    2. #读取
    3. from matplotlib import pyplot as plt
    4. img = cv.imread("image_01.jpg")
    5. #显示
    6. plt.imshow(img[:,:,::-1])
    7. plt.show()
    img[:,:,::-1]的解释是  实现RGB到BGR通道的转换
    

    图像领域img[:,:,::-1]的理解_ZJE_ANDY的博客-CSDN博客_[:,:,::-1]先开门见山,img[:,:,::-1]的作用就是实现RGB到BGR通道的转换 (若图片一开始就是BGR的,就是实现从BGR到RGB的转换)。对于列表img进行img[:,:,::-1]的作用是列表数组左右翻转,例如:import numpy as npa = np.arange(27).reshape(3,3,3)print(a)'''[[[ 0 1 2] [ 3...https://blog.csdn.net/u014453898/article/details/93716118

    注意:opencv显示是窗口形式   plt显示是内置形式

    不清楚的话 自己测试一下代码。

    4.3 保存图像

    cv.imwrite()

     参数:

    • ⽂件名,要保存在哪⾥
    • 要保存的图像

     代码

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. # 1 读取图像
    4. img = cv.imread('image_01.jpg',)
    5. # 利⽤opencv展示图像
    6. cv.imshow('image',img)
    7. cv.waitKey(0)
    8. # 3 保存图像
    9. cv.imwrite('image_01.png',img)

    5.opencv绘制图形

    5.1 绘制直线

    cv.line(img,start,end,color,thickness)

    参数:

    • img:要绘制直线的图像
    • Start,end: 直线的起点和终点
    • color: 线条的颜⾊
    • Thickness: 线条宽度 

    5.2 绘制圆形 

     

    cv.circle(img,centerpoint, r, color, thickness)

     参数:

    • img:要绘制圆形的图像
    • Centerpoint, r: 圆⼼和半径
    • color: 线条的颜⾊
    • Thickness: 线条宽度,为-1时⽣成闭合图案并填充颜⾊

    5.3 绘制矩形 

     

    cv.rectangle(img,leftupper,rightdown,color,thickness)

    5.4 向图像中添加⽂字

    cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)

     代码

    1. import cv2 as cv
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. #创建空白图像
    5. img = np.zeros((512,512,3),np.uint8)
    6. #绘制图像
    7. cv.line(img,(0,0),(511,511),(255,0,0),5) #(255,0,0) 代表B G R
    8. cv.rectangle(img,(384,0),(510,128),(0,255,0),3) #(255,0,0) 代表B G R
    9. cv.circle(img,(200,200),50,(0,0,255),4)
    10. font = cv.FONT_HERSHEY_SIMPLEX
    11. cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
    12. #结果展示
    13. plt.imshow(img[:,:,::-1])
    14. plt.title("结果"),plt.xticks([]),plt.yticks([])
    15. plt.show()

     6.获取并修改图像中的像素点

    1. import numpy as np
    2. import cv2 as cv
    3. img = cv.imread('messi5.jpg')
    4. # 获取某个像素点的值
    5. px = img[100,100]
    6. # 仅获取蓝⾊通道的强度值
    7. blue = img[100,100,0]
    8. # 修改某个位置的像素值
    9. img[100,100] = [255,255,255]

    7.获取图像的属性

     8. 图像通道的拆分与合并

     有时需要在B,G,R通道图像上单独⼯作。在这种情况下,需要将BGR图像分割
    为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。你
    可以通过以下⽅式完成。

    1. # 通道拆分
    2. b,g,r = cv.split(img)
    3. # 通道合并
    4. img = cv.merge((b,g,r))

    9. ⾊彩空间的改变

    OpenCV中有150多种颜⾊空间转换⽅法。最⼴泛使⽤的转换⽅法有两种,
    BGR↔Gray和BGR↔HSV。

    cv.cvtColor(input_image,flag)

    参数:

    • input_image: 进⾏颜⾊空间转换的图像
    • flag: 转换类型
      • cv.COLOR_BGR2GRAY : BGR↔Gray
      • cv.COLOR_BGR2HSV: BGR→HSV
    1. import cv2 as cv
    2. from matplotlib import pyplot as plt
    3. img = cv.imread('image_01.jpg')
    4. # 获取某个像素点的值
    5. plt.imshow(img[:,:,::-1])
    6. gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    7. plt.imshow(gray)
    8. plt.show()

     

  • 相关阅读:
    Jmeter 自动化性能测试常见问题汇总
    C语言求数组最小值,并返回下标
    5个物联网商业案例及其带给我们的启示
    2022年,软件测试已经不吃香了吗?
    [go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目
    antd-design的modal结合form表单传值
    【深度学习】Generative Adversarial Network 生成式对抗网络(GAN)
    前端笔记:Create React App 初始化项目的几个关键文件解读
    Ubuntu系统之管理文件权限一
    自己实现扫描全盘文件的函数。
  • 原文地址:https://blog.csdn.net/weixin_44199723/article/details/126363668