0%

OpenCV(三)-基础操作

一、色彩空间

  • RGB:人眼的色彩空间
  • OpenCV默认使用的是BGR
  • HSV/HSB/HSL
  • YUV 用于视频领域

rgb,bgr用于显示器,硬件中

二、HSV

用于OpenCV中

  • Hue:色相,即色彩,如红色,蓝色
  • Saturation:饱和度,颜色的纯度
  • Value:明度

image-20240827141707890

image-20240827142246376

三、HSL

image-20240827142405633

image-20240827142415289

四、YUV

用于视频

image-20240827142729105

image-20240827142936794

五、色彩转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2

def callback():
pass

# 色彩空间转换
# 定义一个滑块,同一个滑块对不同色彩空间的效果

cv2.namedWindow('color', cv2.WINDOW_NORMAL)

img = cv2.imread(r'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) - 1, callback)


while True:
# 获得当前trackbar的位置
index = cv2.getTrackbarPos('curcolor', 'color')

# 颜色空间转换API
cvt_img = cv2.cvtColor(img, colorspaces[index])
# 显示转换后的图像
cv2.imshow('color', cvt_img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break

cv2.destroyAllWindows()

image-20240827145753347

六、Numpy

  • OpenCV中用到的矩阵都要转换成Numpy数组
  • Numpy是一个经高度优化的Python数值库

基础操作

  • 创建矩阵
  • 检索与赋值[y, x]
  • 获取子数组[:, :]

6.1、创建矩阵

  • 创建数组 array()

    • a = np.array([2, 3, 4]) # 一维
      c = np.array([[1.0, 2.0], [3.0, 4.0]]) # 二维
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16



      - 创建全0/全1数组 zeros()/ ones

      - ```python
      # 高 宽
      # 行的个数, 列的个数, 通道数/层数
      # np.uint8 矩阵中的数据类型
      # opencv中是8*8的3个
      c = np.zeros((8, 8, 3), np.uint8)
      print(c)

      # 定义ones矩阵,默认1个通道
      d = np.ones((8, 8, 3), np.uint8)
      print(d)
  • 创建全值数组 full()

    • # 定义full矩阵
      e = np.full((8, 8), 255, np.uint8)
      print(e)
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16



      - 创建单元数组 identity/eye()

      - ```python
      # 定义单位矩阵identity
      # 斜对角为1,其他为0
      f = np.identity(4)
      print(f)

      # 结果
      [[1. 0. 0. 0.]
      [0. 1. 0. 0.]
      [0. 0. 1. 0.]
      [0. 0. 0. 1.]]
    • # 定义eye矩阵
      g = np.eye(5, 7, k = 3)
      print(g)
      
      # 5*7矩阵
      # k = 3,代表从3开始。0, 1, 2, 3,也就是第4个
      [[0. 0. 0. 1. 0. 0. 0.]
       [0. 0. 0. 0. 1. 0. 0.]
       [0. 0. 0. 0. 0. 1. 0.]
       [0. 0. 0. 0. 0. 0. 1.]
       [0. 0. 0. 0. 0. 0. 0.]]
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34



      ## 6.2、检索与赋值[y, x]

      - `[y, x]`
      - 索引从0开始
      - `[y, x, channel]`
      - channel通道

      ```python
      import numpy as np
      import cv2

      # 设置一个640*480,三层的图片,使用BGR,里面的内容都为0
      img = np.zeros((480, 640, 3), np.uint8)

      # 检索图片中的某个值
      print(img[100, 100])
      count = 0
      while count < 200:
      #BGR 分三层,以下是两种写法
      img[count, 100, 0] = 255
      # img[count, 100] = [0, 0, 255]
      count = count + 1

      cv2.imshow('img', img)

      while True:
      key = cv2.waitKey(0)

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

只在第一层设为255,BGR中B为255,蓝色

image-20241105152213383

6.3、获取子矩阵

  • [y1:y2,x1,x2]:y1到y2,x1到x2这个矩形
  • [:,:]:代表全部像素点
1
2
3
4
5
6
7
8
9
10
11
12
# 子矩阵
roi = img[100:400, 100:600] # roi为一个500*300的矩形
roi[:,:] = [0,0,255] # 全部背景设为红色
roi[10:100,10:200] = [0, 255, 0] # 左上角这个190*90的空间设为绿色

cv2.imshow('img', roi)
while True:
key = cv2.waitKey(0)

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

image-20241105153101053


七、Mat

image-20241105160027471

头部存放类型等

image-20241105160142843

Mat拷贝

默认使用浅拷贝

image-20241105160243484

浅拷贝

1
2
3
Mat A
A = imread(file, IMREAD_COLOR)
Mat B(A)

深拷贝

1
2
3
4
5
6
# 默认的两个API
cv::Mat::clone()
cv::Mat::copyTo()

# python没有上面两个API,而是使用copy()
copy()

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)

# 浅拷贝
img2 = img

# 深拷贝
img3 = img.copy()

img[10:50, 10:100] = [0, 0, 255]

cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)

image-20241105161349606

八、图像的多种属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)

# shape属性中包括了三个信息
# 高度、长度、通道数
print(img.shape)

# 图像占用多大空间
# 高度 * 长度 * 通道数
print(img.size)

# 图像中每个元素的类型
print(img.dtype)

输出结果:

1
2
3
(300, 400, 3)
360000
uint8

九、通道分离与合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)

# 分离
b,g,r = cv2.split(img)

b[10:50, 20:100] = 255 # 分离之后就变成了黑白色
g[10:50, 20:100] = 255

# 合并
img2 = cv2.merge((b,g,r))

cv2.imshow('img', img)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('img2', img2)

cv2.waitKey(0)


image-20241105162825205

-------------本文结束感谢您的阅读-------------