opencv真货第二节

目录

二、OpenCV基础知识和绘制图形

1.OpenCV的色彩空间

1)RGB和BGR

2).HSV,HSL和YUV

2.OpenCV的重要数据结构--Mat

1).Mat的组成

 2).Mat拷贝

 3).图像的分割与融合


二、OpenCV基础知识和绘制图形

1.OpenCV的色彩空间

1)RGB和BGR

      最常见的色彩空间就是RGB,人眼也是基于RGB的色彩空间去分辨颜色的。
      openCV默认使用的是BGR.BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同.。

显示图片的时候需要注意适配图片的色彩空间和显示环境的色彩空间。比如传入的图片是BGR色彩空间,显示环境是RBG空间,就会出现颜色混乱的情况.

2).HSV,HSL和YUV

①HSV(HSB)

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

 为什么要使用HSV?

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

 ②HSL

HSL和HSV差不多。

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

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

 HSV和HSL的区别:

 HSB和HSL在字面意思上是一样的:

  • H指的是色相(Hue),就是颜色名称,例如“红色”、“蓝色”;
  • S指的是饱和度(Saturation),即颜色的纯度;
  • L (Lightness)和B (Brightness)是明度,颜色的明亮程度 

     在原理和表现上,HSL和HSB中的H(色相)完全一致,但二者的S(饱和度)不一样,L和B(明度)也不一样:

  • HSB中的S控制纯色中混入白色的量,值越大,白色越少,颜色越纯;
  • HSB中的B控制纯色中混入黑色的量,值越大,黑色越少,明度越高;
  • HSL中的S和黑白没有关系,饱和度不控制颜色中混入黑白的多寡;
  • HSL中的L控制纯色中的混入的黑白两种颜色

③YUV

       YUV,是一种颜色编码方法。常使用在各个视频处理组件中。YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。

"Y”表示明亮度(Luminance或Luma),也就是灰阶值,“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的水平取样,垂直完全采样。

一张图片的色彩空间代码:

import cv2
from pandas import DataFrame
img=cv2.imread('OIP-C.jpg')
cv2.imshow('image',img)
df=DataFrame(img.reshape(-1,3))
print(df.head())
#查看颜色从前往后是否重复 所有重复的,true的值
print(df.duplicated().sum())
#不重复的值
print(109620-df.duplicated().sum())
print(df.shape)
#print(img)
cv2.waitKey(0)
cv2.destoryALLWindows()

下面是几种颜色空间的转化代码,使用trackbar的调节

import cv2

def callback(value):
    pass
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color',640,480)
#读取照片,默认是BGR的色彩空间
img=cv2.imread('OIP-C.jpg')
#定义颜色空间转化列表
colorspaces=[
#所有颜色空间的转化都是COLOR开头
    cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,
    cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,
    cv2.COLOR_BGR2YUV
]
#设置trackbar
cv2.createTrackbar('trackbar','color',0,4,callback)
while True:
    #获取trackbar的值
    index=cv2.getTrackbarPos('trackbar','color')
    #进行颜色空间转换
    cvt_img=cv2.cvtColor(img,colorspaces[index])
    cv2.imshow('color',cvt_img)
    key=cv2.waitKey(10)
    if key==ord('q'):
        break
cv2.destoryALLWindows()

2.OpenCV的重要数据结构--Mat

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

  • opencv用mat这种数据结构来表示图片的.
  • C++中是用mat来保存图片. python中把mat转化成了numpy的ndarray

 看下面代码就能理解:

1).Mat的组成

Mat由header和data组成, header中记录了图片的维数大小,数据类型等数据。

Mat其实是一个类:

Mat的属性:在python中转化为numpy的ndarray:

ndarray的四个常见的基本属性:

img.shape(形状)、img.size(大小)、img.dtype、img.ndim(维度)与上面对用。其他:img.itemsize、img.imag

 2).Mat拷贝

  • Mat共享数据

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

因为python中图片数据已经包装成ndarray了,所以对mat的深浅拷贝,其实就是对ndarray深浅拷贝。

 3).图像的分割与融合

   分割与融合都是访问图像的属性:

import cv2
import numpy as np
img=np.zeros((200,200,3),np.uint8)
#分割通道
b,g,r=cv2.split(img)
b[10:100,10:100]=255
g[10:100,10:100]=255
#合并通道
img2=cv2.merge((b,g,r))
cv2.imshow('img',np.hstack((b,g)))
cv2.imshow('img2',np.hstack((img,img2)))
cv2.waitKey(0)
cv2.destroyALLWindows()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值