zoukankan      html  css  js  c++  java
  • OpenCV4【4】- 图像基本操作

    图像基本操作很多,这里做个汇总

    首先要注意,opencv 中像素通道顺序为 BGR,与我们常说的 RGB 刚好相反。

    首先准备一张图片,可创建新图像,也可读取已存在的图像

    img = np.zeros(shape=(300, 300, 3), dtype=np.uint8)
    cv.namedWindow('t')
    cv.imshow('t', img)

    获取图像属性

    ## 行、列、通道数
    # 如果是彩色图,返回 行、列、通道数;如果是灰度图,返回 行、列
    print(img.shape)        # (300, 300, 3)
    
    ## 像素总数
    print(img.size)         # 270000
    
    ## 数据类型
    # img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的
    print(img.dtype)        # uint8

    获取和修改像素

    # 对于 BGR 图像,它返回一个由蓝色、绿色和红色值组成的数组。对于灰度图像,只返回相应的灰度
    px = img[100, 100, 0]       # 获取
    print(px)                   # 0
    
    img[100: 200, 100: 200, :3] = np.random.randint(0, 255, size=[100, 100, 3], dtype=np.uint8)      # 修改
    cv.imshow('t', img)
    cv.waitKey(0)

    获取感兴趣区域 ROI

    这里主要了解 ROI 概念,其实就是 获取图像某部分

    roi = img[100: 150, 100: 150, : 3]        # 获取 roi
    img[200: 250, 200: 250, : 3] = roi        # 移动 roi
    cv.imshow('t', img)
    cv.waitKey(0)

    拆分 和 合并 通道

    ## 拆分:把 b g r 拆分开,合并:把 一个 通道 合并到 某个图像
    # 拆分
    b, g, r = cv.split(img)
    # 合并
    img2 = cv.merge((b, b, b))
    cv.imshow('t', img2)
    cv.waitKey(0)

    cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引

    设置边框 和 填充

    # def copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None):
    constant= cv.copyMakeBorder(img, 10, 20, 30, 10, cv.BORDER_CONSTANT, value=[255, 0, 0])
    cv.imshow('t', constant)
    cv.waitKey(0)

    未完待续...

    参考资料:

  • 相关阅读:
    java方法参数传值传引用的一点看法
    Oracle触发器介绍
    CASE WHEN
    group by ,order by ,having
    Java中使用正则表达式
    Oracle 9i 分析函数参考手册
    ORACLE round 与 trunc 的区别
    oracle的默认表名长度(30)
    order by 使用索引的情况
    解析oracle的ROWNUM 作者: chen_liang
  • 原文地址:https://www.cnblogs.com/yanshw/p/15378900.html
Copyright © 2011-2022 走看看