当前位置 博文首页 > soul_study的博客:基于python的opencv快速入门第一篇

    soul_study的博客:基于python的opencv快速入门第一篇

    作者:[db:作者] 时间:2021-08-12 15:07

    基于python的opencv快速入门第一篇

    太原理工大学机器人团队20日打卡day14

    1、图像处理基础

    ? opencv是一个基于BSD许可发行的跨平台计算机视觉库,而在我个人看来,因为其可以用于Linux,也就意味着可以装载在树莓派的嵌入式系统上。十分有利于我开发机器人视觉方面的问题。当然,我并不是计算机专业,对于其中更深层次的算法没有追求,还是追求更高效的利用这个库来完善我的机器人等方面。

    ? 其中配置安装方面的问题我就不多加赘述,csdn上有许多相关文章,建议大家可以看,如果有问题私聊相关作者也是十分不错的选择。

    ? 当然,本人认为该方面应用更难,所以会尝试写出更多练习代码,当然,大部分源于李立宗的《Opencv轻松入门:面向Python》。这只是我总结的知识点,便于忘记时候快速查询,而不是一篇教程。

    1.1图像基本表示方法

    1. 二值图像

    • 仅包含黑白两个颜色。
    • 矩阵上只有0和1两个数字

    2. 灰度图像

    • 计算机把从纯黑到纯白分为256个灰度级(“0”表示纯黑,“255”表示纯白)
    • 矩阵每个像素点有(0,255)来表示该点对应灰度

    3. 彩色图像

    • 图像分为RGB三个通道
      • 每个通道值都在[0,255]

    1.2像素处理

    1. 生成矩阵

    • 我们可以利用Numpy库中zeros()来生成矩阵
    • 代码如下
    import numpy as np
    img = np.zeros((8,8),dytpe = np.uint8)

    Notes:

    • as np 可以不适用,但是使用可以更简便
    • 该代码表示生成一个8x8的灰度矩阵
    • 在利用矩阵知识,就可以控制其中的像素点
    img[0,3] = 255

    Notes:

    • 该代码表示将[0,3]像素改为白色

    2. 读取图像

    • 可以利用cv2库里的imread函数
    • 格式如下
    import cv2
    img = cv2.imread("img.jpg",0)

    在这里插入图片描述

    Notes:

    • 表示读取img灰度图像

    3. 彩色图像

    • 彩色图像相比较与灰度图像,实际上只是增加了第三个变量
    • 由[0,2]分别表示BGR通道
      在这里插入图片描述在这里插入图片描述
      而利用zeros生成对应矩阵代码为
    img = np.zeros((300,300,3),dtype=np.uint8)
    • 小示例:
      • 生成一个三维数组,用来观察三通道的变化情况
    import cv2
    import numpy as np
    img = np.zeros((300,300,3),dtype=np.uint8)
    img[:,:,0] = 255
    img[:,:,1] = 255
    img[:,:,2] = 255
    cv2.imshow("img",img)
    cv2.waitKey()
    cv2.destroyAllWindows()

    运行结果

    • 其中imshow表示弹出一个窗口显示画面,名叫img
      • imshow函数下必须有waitkey()函数
      • 该函数表示等待输入,如果有按键退出窗口
      • destroyAllwindows表示关闭所有窗口
    • 都是一些比较基本的函数,记住即可

    1.3 使用numpy.array访问像素

    • 函数item()可以更高效的访问像素点
    • 语法格式为
    item(行,列,通道)

    示例:

    • 读取First.jpg的第一行第一列的G通道数值
    import cv2
    lena = cv2.imread("First.jpg")
    print("读取像素点= ", lena.item(1,1,1))
    • 函数itemst()可以用来修改像素值
    • 语法格式为
    itemset(索引值,新值)

    示例

    生成一个灰度图像,其中的像素值均为随机数

    import numpy as np
    import cv2
    img = np.random.randint(0,256,size=[256,256],dtype = np.uint8)
    cv2.imshow("demo",img)
    cv2.waitKey()
    cv2.destoryAllWindows

    1.4感兴趣区域(ROI)

    图像中的数字分别表示行号和列号。那么,图像中黑色ROI可以表示为

    img[200:400,200:400]
    在这里插入图片描述

    通过一下语句可以将ROI复制到该区域右侧

    a=img[200:400,200:400]
    img[200:400,600:800]=a

    在这里插入图片描述
    同时,也可以使用该方法进行打码处理

    import cv2
    import numpy as np
    a=cv2.imread("lenacolor.png", cv2.IMREAD_UNCHANGED)
    cv2.imshow("original", a)
    face=np.random.randint(0,256, (180,100,3))
    a[220:400,250:350]=face
    cv2.imshow("result", a)
    cv2.waitKey()
    cv2.destroyAllWindows()

    运行结果

    1.5 通道操作

    通道拆分

    • 可以通过索引拆分
      • 比较麻烦,直接讲第二种
    • 通过cv2.split(img)函数拆分
    • 语法如下
    b,g,r = cv2.split(img)

    通道合并

    • 利用cv2.merage()可以实现合并
    • 语法如下
    rgb=cv2.merge([r,g,b])

    示例

    先拆分通道,再表示b,br分别为0的图像

    再合并图像

    import cv2
    lena = cv2.imread("First.jpg")
    cv2.imshow("lena1",lena)
    b,g,r = cv2.split(lena)
    cv2.imshow("b",b)
    cv2.imshow("g",g)
    cv2.imshow("r",r)
    lena[:,:,0]=0
    cv2.imshow("lenab0",lena)
    lena[:,:,1]=0
    cv2.imshow("lenab0g0",lena)
    bgr=cv2.merge([b,g,r])
    cv2.imshow("bgr",bgr)
    cv2.waitKey()
    cv2.destroyAllWindows()

    图像运行结果可自行尝试

    1.6 获取图像属性

    import cv2
    color = cv2.imread("First.jpg")
    print("图像colorshux:")
    print("color.shape=", color.shape)
    print("color.size=", color.size)
    print("color.dtype= ",color.dtype)

    该代码比较常用,是固定套路,可以记住。

    以上就是今日内容,因为主要在于实践,背后还有很多实验代码乃至于我用了一个下午学习该部分,大家也可以多加尝试

    cs