OpenCV学习笔记 - OpenCV必知必会的基础

文章目录

  • OpenCV必知必会的基础(一)
    • 色彩空间变换
      • cv2.cvtColor(img, colorspaces[i])
      • 代码示例
    • Numpy基本操作
      • 创建矩阵
        • 创建数组 array(list)
        • 创建全零/一数组 zeros(shape,dtype)/ones(shape,dtype)
        • 创建全值数组 full(shape,data,dtype)
        • 创建单位数组 identity(shape,dtype)/eye(shape,k)
      • 检索与赋值
        • 单通道图像检索/赋值
        • 三通道图像检索/赋值
      • 获取子数组
        • [x1:x2,y1:y2]
        • [:,:]
      • 深拷贝与浅拷贝
      • 图像的多种属性
        • img.shape
        • img.size
        • img.dtype
      • 通道的分割与合并(超级重点)
        • cv2.split(mat)
        • cv2.merge((ch1,ch2,...))
        • 代码实例

OpenCV必知必会的基础(一)

色彩空间变换

cv2.cvtColor(img, colorspaces[i])

  • 功能:实现色彩空间之间的转换
  • 参数说明
    • img : 输出的图像
    • colorspaces[i] : 色彩空间转换码(用一个数组进行存储,传参时选择转换码数组中的一个转换码)
    • 附录:常见的色彩空间列表
      OpenCV学习笔记 - OpenCV必知必会的基础_第1张图片

代码示例

import cv2

# 回调函数
def callback():
    pass

# 创建窗口
cv2.namedWindow('color',cv2.WINDOW_NORMAL)

# 读取图片
img = cv2.imread('./img/Lena.jpg')

# 色彩空间设置,并可视化
colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA,
               cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV_FULL,
               cv2.COLOR_BGR2YUV]

# 创建TrackBar,将需要转换的颜色空间进行可视化
cv2.createTrackbar('curcolor','color',0, len(colorspaces), callback)

while True:
    i = cv2.getTrackbarPos('curcolor','color')

    ## 颜色空间转换API
    cvt_img = cv2.cvtColor(img,colorspaces[i])

    # 展示图片
    cv2.imshow('color',img)

    key = cv2.waitKey(10)
    if key & 0xFF == ord('q'):
        break

## 销毁窗口
cv2.destroyAllWindows()

Numpy基本操作

创建矩阵

创建数组 array(list)

  • 参数说明

    • list:转换成numpy格式的列表
  • 代码示例

    ## 创建一维
    a = np.array([2,3,4])
    
    ## 创建二维
    b = np.array([[1.0,2.0],[3.0,4.0]])
    

创建全零/一数组 zeros(shape,dtype)/ones(shape,dtype)

  • 参数说明
    • shape : (行的个数,列的个数,通道数/层数)
    • dtype : 选择数据的类型
  • 代码示例
    # 创建全零数组
    c = np.zeros((8,8,3),np.uint8)
    
    # 创建全一数组
    d = np.ones((8,8,3),np.uint8)
    

创建全值数组 full(shape,data,dtype)

  • 参数说明
    • shape : (行的个数,列的个数,通道数/层数)
    • data : 需要填充的数值
    • dtype : 选择数据的类型
  • 代码示例
    e = np.full((8,8,3),255,np.uint8)
    

创建单位数组 identity(shape,dtype)/eye(shape,k)

  • 参数说明
    • shape : 若为单位矩阵(indentify)则为方阵的尺寸,若为eye则可以任意选择尺寸
    • dtype : 选择数据的类型
    • k:从第0行的第k列开始依次朝着右下角方向数值为1,其余为0
  • 代码示例
    ## 定义单位矩阵
    f = np.identity(4,np.uint8)
    
    ## 定义eye矩阵(可以不是方阵)
    g = np.eye(5,3,k=2)
    

检索与赋值

单通道图像检索/赋值

  • 检索方法img[x,y]
  • 赋值方法img[x,y]=data
  • 代码实例
    ## 随机初始化一个灰度图
    img = np.zeros((480,480))
    
    ## 展示图片
    cv2.imshow('img',img)
    
    ## 检索图片的像素点
    print(img[40,40])
    
    ## 在图片中画一条白线
    count = 0
    while count<200:
        img[count,200] = 255
        count = count + 1
    
    # 展示图片
    cv2.imshow('img',img)
    
    # 设置显示时间
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
    	cv2.destroyAllWindows()
    

三通道图像检索/赋值

  • 检索方法img[x,y,channel]

  • 赋值方法img[x,y,channel] = data

  • 代码实例

    # 我们以莱娜图为例子,读取一张图片(注意如果不使用cv2.namedWindow,直接使用imshow也会自动创建窗口)
    img = cv2.imread('./img/Lena.jpg')
    
    ## 从矩阵中读取某一个值
    print(img[40,50,2])
    
    ## 修改矩阵的一个像素点
    img[40,50,0] = 0
    img[40,50,1] = 0
    img[40,50,2] = 0
    
    ## 在图像中画一条竖线
    count = 0
    while count<100:
    ## 注意事项:BGR通道如果全部设置为255则为白线,若只设置一个255则为蓝线或者绿线或者红线
        img[count,100,0]=255
        img[count,100,1]=0
        img[count,100,2]=0
        count = count + 1
    
    # 展示图片
    cv2.imshow('img',img)
    
    # 设置显示时间
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
    	cv2.destroyAllWindows()
    

获取子数组

[x1:x2,y1:y2]

  • 方法img[x1:x2,y1:y2]
  • 代码实例
    # 读取莱娜图
    img = cv2.imread('./img/Lena.jpg')
    
    # 截取莱娜图一小部分
    img = img[50:300,50:300]
    
    # 显示图片并设置显示时间
    cv2.imshow('img',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
    	cv2.destroyAllWindows()
    

[:,:]

  • 方法img[:,:]常用于子数组赋值
  • 代码实例
    # 读取莱娜图
    img = cv2.imread('./img/Lena.jpg')
    
    # 截取莱娜图一小部分
    img = img[50:300,50:300]
    
    
    # 将莱娜图的一小部分抠掉
    img[:,:] = [0,255,0]
    
    # 显示图片并设置显示时间
    cv2.imshow('img',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

深拷贝与浅拷贝

  • 浅拷贝:是两个变量共享一份数据;
  • 深拷贝:是将数据复制两份,相互独立互补干扰 img1 = img.copy()
  • 代码实例
    # 读取莱娜图
    img = cv2.imread('./img/Lena.jpg')
    
    # 浅拷贝(共用一份数据)
    img1 = img
    
    # 深拷贝(将数据复制两份)
    img2 = img.copy()
    
    
    img[50:100,50:100] = [0,255,0]
    cv2.imshow('img',img)
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

图像的多种属性

img.shape

  • 功能:打印图像的尺寸包括(高度,长度,通道数)

img.size

  • 功能:打印图像的大小包括(高度×长度×通道数)

img.dtype

  • 功能:打印图像像素点的数据类型

通道的分割与合并(超级重点)

cv2.split(mat)

  • 功能: 将图片的通道完全分离
  • 参数说明
    • mat : 需要分割的多通道图像

cv2.merge((ch1,ch2,…))

  • 功能: 将零散图片的通道合并
  • 参数说明
    • (ch1,ch2,…) : 需要合并的图像

代码实例

# 随机初始化一张空白图片
img = np.full((480,640,3),255,np.uint8)

# 分割图片(注意通道顺序是BGR不能搞错)
b_channel,g_channel,r_channel = cv2.split(img)

g_channel[:,:] = 0

## 合并通道
img1 = cv2.merge((b_channel,g_channel,r_channel))

# 展示图片并设置显示时间
cv2.imshow('img',img)
cv2.imshow('img1',img1)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
    cv2.destroyAllWindows()

你可能感兴趣的:(图像处理技术,opencv,学习,计算机视觉)