zoukankan      html  css  js  c++  java
  • OpenCV学习笔记(3)——图像的基本操作

    • 获取图像的像素值并修改
    • 获取图像的属性(信息)
    • 图像的ROI()
    • 图像通道的拆分及合并

    1.获取并修改像素值

      先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信息,像素信息为按照BGR顺序排列(灰度图像会返回其灰度值)的一个list,也可以用list操作提取其单个值

    import numpy as np
    import cv2

    img = cv2.imread('2.jpg')
    px = img[100,100]
    print(px)
    blue = img[100,100,0]
    print(blue)
    ##[215 218 222]
    ##215

    还可以通过直接给像素赋值的方式来改变像素值

    img[100,100] = [255,255,255]

    结合Numpy库的操作会获得更好的获取像素值方法

    import numpy as np
    import cv2

    img = cv2.imread('2.jpg')
    px = img.item(10,10,2)%获取像素值
    print(px)
    img.itemset((10,10,2),100)%修改像素值
    print(img.item(10,10,2))
    #211
    #100

    这个方法只能获取到标量值,即无法用img.item(10,10)这样的操作获取一个list,只能通过输入一个3维坐标获取单个值

    2.获取图像属性

      图像属性包括:行列,通道(色彩),图像数据类型,像素数目等

      img.shape可以获取图像的形状,其返回值是一个包括行数,列数,通道数的元组。

      import numpy as np
      import cv2

      img = cv2.imread('2.jpg')
      print(img.shape)

      #(300, 450, 3)

      如果读入的图是一个灰度图,则不返回通道数,此时若调取第3个值会报错。可以通过检查返回值就可以知道加载图像是灰度图还是彩图。

      img.size会返回图像的像素数

      img.dtype返回的是图像的数据类型(一般是uint8),该步在debug时很重要,因为在OpenCV-Python代码中经常出现数据类型不一致的情况

      

    3、图像ROI

      即提取图像的特点区域,通过切片方式来实现

     import numpy as np
    import cv2

      img = cv2.imread('2.jpg')
      eye = img[160:180,140:150]
      img[0:20,0:10] = eye

    4.拆分及合并图像通道

       即将BGR三个通道拆分分别进行操作,或将三个通道合并形成BGR图像

    import numpy as np

    import cv2

    img = cv2.imread('2.jpg')
    b,g,r = cv2.split(img) #可以把图像分成三个通道

    # img = cv2.merge(b,g,r)  教程上说可以这样用,但输入后会提示只能输入两个值
    cv2.imshow('img',r) #在尝试中发现imshow能显示的图像必须有1或3或4条信道
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    但是cv2.split操作较耗时,一般还是用切片方法

    b = img[:,:,0]

    同理,若要使所有红色通道均为0,可以

    img[:,:,2] = 0

    5.为图像扩边(填充)

      如果想在图像周围创建一个边,就想相框一样,可以使用cv2.copyMakeBorder()函数。他经常在卷积运算或0填充时被用到。它包括以下几个参数:

    •      src输入图像
    •   top,bottom,left,right对应边界的像素数目
    •   borderType要添加那种类型的边界,类型有

      – cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
      – cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
      – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
      – cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh

      – cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh|abcdefgh|abcdefg

    •  value边界颜色,当边界类型为cv2.BORDER_CONSTANT









  • 相关阅读:
    我的第一个B2C 网上图书商店,初始化
    JFreeChat学习圆饼状图的创建(结合serlvet,非原创)!
    JFreeChat学习柱状图的创建(X,Y轴的口口问题还未解决,固暂时使用拼音表示)
    JFreeChat学习柱状图关于 口口 的进一步解决方案
    JSON发送的工具类分享,应该还是蛮常用的!
    linux 常见命令
    mysql常用命令
    php 实现树状无限分类查询
    轻量级的mvc框架封装
    lamp 环境下,php7.0以上,配置重写rewrite,影藏index.php
  • 原文地址:https://www.cnblogs.com/zodiac7/p/9277306.html
Copyright © 2011-2022 走看看