OpenCV:02基础知识和绘制图形

OpenCV的色彩空间

RGB和BGR

最常见的色彩空间就是RGB,人眼也是基于RGB的色彩空间去分辨颜色的

OpenCV默认使用的是BGRBGRRGB色彩空间的区别在于图片在色彩通道上的排列顺序不同

显示图片时要注意适配图片的色彩空间和显示环境的色彩空间:比如传入的图片是BGR色彩空间,显示环境是RGB色彩空间,就会出现颜色混乱的情况
在这里插入图片描述


HSV,HSLYUV

HSV(HSB)

OpenCV用的最多的色彩空间就是HSV

  • Hue:色相,即色彩,如红色、蓝色,用角度来度量,取值范围为0°~360°,从红色开始按照逆时针方向计算,红色为0°,绿色为120°,蓝色为240°
  • Saturation:饱和度, 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
  • Value(brightness): 明度. 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
    在这里插入图片描述
    为什么要使用HSV?

方便OpenCV做图像处理.比如根据hue的值就可以判断背景颜色.


HSL

HSLHSV差不多

  • Hue: 色相
  • Saturation: 饱和度
  • Lightness: 亮度

HSL在顶部是纯白的, 不管是什么颜色.

HSLHSV的区别
在这里插入图片描述

在这里插入图片描述
理解:
在这里插入图片描述


YUV

YUV是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽(因为我们人眼分不出太多的颜色,因此可以节约带宽)

  • Y”表示明亮度(Luminance或Luma),也就是灰阶值,以前的黑白电视就是只用Y调整灰度即可
  • U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度用于指定像素的颜色。

Y'UV的发明是由于彩色电视与黑白电视的过渡时期。

Y'UV最大的优点在于只需占用极少的带宽。

  • 4:4:4表示完全取样。
  • 4:2:2表示2:1的水平取样,垂直完全采样。
  • 4:2:0表示2:1的水平取样,垂直2:1采样。
  • 4:1:1表示4:1的水平取样,垂直完全采样。

在这里插入图片描述

4Y只有——>2U或者2V


颜色空间的转化

关键API cv2.cvtColor()

# 关键API cv2.cvtColor()
import cv2

# 定义一个回调函数callback——> 我们要使用trackbar滑块
def callback(value):
    pass # 我们不需要功能实现 因此直接pass

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

# 读取图片 ——> opencv读进来的格式默认是BGR的色彩空间
img = cv2.imread('./cat.jpeg')

# 定义颜色空间转化列表
color_spaces = [
    # 记忆:所有颜色空间的转化都是以"COLOR"开头的 
    cv2.COLOR_BGR2RGBA , cv2.COLOR_BGR2BGRA ,# BGRA中的‘A’表示透明度
    cv2.COLOR_BGR2GRAY , cv2.COLOR_BGR2HSV ,
    cv2.COLOR_BGR2YUV
]

# 设置一个trackbar滑块
cv2.createTrackbar('trackbar' , 'color' , 0 , 4 , callback) # (trackbar的名字,在哪个窗口上实现,默认值,最大值)

# 不停地循环展示窗口
while True:
    # 获取trackbar的值 ——> 转换成索引(用于选择颜色空间转换的形式)
    index = cv2.getTrackbarPos('trackbar','color') # (trackbar的名字,窗口的名字)
    
    # 进行颜色空间转化 ——> 把我们的img图片转换成对应的色彩
    cvt__img = cv2.cvtColor( img , color_spaces[index] )

    # 展示图片
    cv2.imshow('color' , cvt__img)
    
    # 退出的条件
    key = cv2.waitKey(1)
    if key == ord('q') or key == ord('Q'):
        break
        
# 消除窗口
cv2.destroyAllWindows()


OpenCV的一种重要数据结构——Mat

Mat介绍

Mat是OpenCV在C++语言中用来表示图像数据的一种数据结构,在python中转化为numpy的darray

  • Mat由指针hearder和数据data组成

在这里插入图片描述


Mat拷贝

在python中Mat数据对应numpy的ndarray,使用numpy提供的深浅拷贝方法可以实现对Mat的拷贝

# 关于深浅拷贝
    # 浅拷贝:仅仅是复制出一个“指针”,共同指向一份data数据 ——> data数据发生改变,浅拷贝的数据也会改变
    # 深拷贝:完全复制出一份和原始数据一样的数据(包括data)——> data数据发生改变,深拷贝的数据不会发生改变!
    
# 因为在python中,图片数据已经包装成ndarray,而非mat
    # 因此对ndarray的深浅拷贝 ——> 就是对mat的深浅拷贝
    
import cv2
import numpy as np

cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',480,640)

# 读入图片
img = cv2.imread('./cat.jpeg')
 
# 浅拷贝
img2 = img.view() # 其底层数据的内存地址是一样的,仅仅是名字不一样而已

# 深拷贝
img3 = img.copy() 

# 改变图片中某个位置的颜色,便于观察深浅拷贝结果
img[10:100,10:100] = [0,0,255] # 把img图像上[10:100,10::100]的位置颜色改为红色[0,0,255]

# 展示图片 ——> 我们让图片一起显示出来 np.hstack()使图像横向堆叠 ;np.vstack()使图像纵向堆叠
cv2.imshow( 'img' , np.hstack( (img,img2,img3) ) )

# 退出的条件
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述

我们发现前两张图片的颜色给改了,而最后一张图片的颜色没有被修改——> 因为前两个是浅拷贝,所以它们的底层数据是一样的,而最后一个是深拷贝,是一份独立的数据


访问图像(Mat)的属性

opencv的Mat在python中已经转换成了ndarray,通过ndarray的属性即可访问Mat图像的属性

import cv2
import numpy as np

img = cv2.imread('./cat,jpeg')

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

# 图像占用空间计算
# 高度×长度×通道数
print(img.size)

# 图像中每一个图像的位深
print(img
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值