opencv+图像处理(Image Processing in OpenCV) 4-0改变颜色空间的过程

目录
  • 0.本节涉及的opencv新函数
  • 1.彩色的形成
  • 2.彩色空间
  • 3.为什么需要选择合适的彩色空间
  • 4.如何选择合适的彩色空间
  • 5.常用的彩色空间 RGB
  • 6.变换彩色空间数学公式
  • 7.opencv变换彩色空间代码+注释+效果

本专栏代码地址https://github.com/xiawei20161308104/xv_opencv_tutorials
本节代码路径xv_opencv_tutorials/ImageProcessinginOpenCV/changing_colorspaces.py
参考 图像工程第4版,张毓晋,清华大学出版社

0.本节涉及的opencv新函数

颜色空间转化函数 cv.cvtColor()

1.彩色的形成

“Indeed rays,properly expressed,are not colored”——牛顿。

光线为不同频率的电磁波,人的视觉能感受到光的刺激,并且将不同频率的电磁波感知为不同颜色,所以,彩色仅存在于人的眼睛和大脑中,物理世界分布的是带有不同辐射能量的光线。

2.彩色空间

彩色模型建立在彩色空间之上,彩色模型和彩色空间的概念不做分别。
根据原理可以分为4类,根据应用可以分为2类

根据原理模型 原理 举例
比色模型/色度模型 基于对光谱反射的物理测量 为颜色"id",颜色最精确的表达
生理学模型 基于人类视网膜中存在的3种基本颜色感知锥细胞 RGB
心理物理模型/精神物理学模型 基于人类对颜色的感知 HSI,HCV,L*a*b*
对立模型 基于感知实验 HSB
根据应用模型 应用 举例
面向硬设备 显示器,打印机 RGB,CMY,CMYK
面向视觉 动画,图像处理 HSI,HSB,L*a*b*

3.为什么需要选择合适的彩色空间

人对彩色的感知与刺激视网膜的电磁辐射的谱能量分布,人的神经心里学,人的生理行为等有关,感知彩色是一个很复杂的过程,应用也存在多样性。CIE定义了若干彩色模型,每个模型都只有特定的适用情况,
没有一种通用模型满足所有情况,由彩色原理和彩色应用等去选择合适的彩色模型能统一处理问题的维度。

4.如何选择合适的彩色空间

了解自己的需求并寻找对应特性的彩色空间。例如,RGB模型特别适合在图像采集输入和图像输出显示等场合应用,但与人类视觉感知有一定区别,就是当我们看到一幅图像的时候并不能感知到他的红绿蓝各有多少分量,这个时候HSV模型就比较适配,H代表色调,S代表饱和度,V代表强度,这样建立的模型与人的感知高度适配。
在HSV模式下分析图像,取到图像的V值,并减小100个像素到v1,对比观察,能发现,人眼就能明显感知到亮度的变化。

def main():
    # 读取图像
    src = cv.imread("../imgs/opencv.png")
    # 转换HSV空间
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    # 分离通道
    h, s, v = cv.split(hsv)
    cv.namedWindow("v", cv.WINDOW_NORMAL)
    cv.imshow("v", v)
    # 减小亮度
    v1 = v - 30
    cv.namedWindow("v1", cv.WINDOW_NORMAL)
    cv.imshow("v1", v1)  

    cv.waitKey(0)
    cv.destroyAllWindows()

5.常用的彩色空间 RGB

(出自图像工程第4版,张毓晋,清华大学出版社)

  • 基于 人体锥细胞,为一种与人的视觉系统结构密切相连的模型
  • 视网膜中三种不同的感受彩色的锥细胞的波长响应曲线SML与三原色RGB基本对应
  • RGB模型的建立在笛卡尔坐标系统中
  • 原点为黑色,离原点最远的顶点为白色,这两点连线上为深浅不同的灰色

CMY

  • 三色光两两叠加产生三补色CMY,C为蓝绿(绿+蓝),M为品红(红+蓝),Y为黄(红+绿)
  • 一般用于出版社打印,图像处理不常用

HSI

  • HSI与人类感知相对应,被称为面向用户的彩色模型
  • 用色调(Hue)、色饱和度(Saturation)和亮度(Intensity)来描述色彩
  • 独立于显示设备
  • HSI的优点:
    • 强度分量与图像的彩色信息无关,是独立的, 也就是强度/亮度分量的变换并不改变图像的色调和饱和度。
    • H与S独立并且适配人的感官,使得HSI模型非常适合基于人的视觉系统对彩色感知特性进行处理分析的图像算法。
  • HSI的缺点:
    • 并不是均匀彩色空间模型——人所感觉到的两点的色彩区别程度与色彩空间两点的欧氏距离相对应。

为了更直观的感受HSI彩色模型对人类感官的适配,代码拆分了同一幅图的RGB分量和HSV分量。

颜色越深则该分量值的占比越大。可以看出,HSI的三幅图看起来很不相同,表示,人眼能感觉到的HSI三个分量的区别要比RGB三个分量的区别要大

L*a*b*

  • 从人的直观感受来看,彩色模型对彩色的描述应该与人对彩色的感知越同步越好,L\*a\*b\*是一个均匀彩色空间,即,人所感觉到的两点的色彩区别程度与此空间中两点的欧氏距离相对应
  • 也是一个面向人类视觉的彩色空间,与设备无关,适合接近自然光照明的应用场合

6.变换彩色空间数学公式

每个工具包工具定义的分量范围不同,像色调H可以是0-180也可以是0-360,在数学上,可以互相转换。所以opencv在处理时,对于8位和16位图像,R、 G 和 B 被转换为浮点格式,并按比例缩放归一化到0-1。
部分转换公式如下:

  • RGB2Gray

  • RGB2CIE XYZ

  • RGB2HSV

7.opencv变换彩色空间代码+注释+效果

opencv的cvtColor函数实现色彩空间的转换,提供了150种颜色空间的转换方式,只需要在cvtColor函数的flag位填写对应的转换标识即可。转换标识获取如下。

import cv2 as cv
flags = [i for i in dir(cv) if i.startswith('COLOR_')]
#这里会输出150种flag,他们是opencv定义的彩色空间转换flag,是cv.cvtColor(input_image, flag)的第二个参数值。
print( flags )

可以自己通过上面的代码获取,或者直接查询官方文档

这里介绍两种转换代码和效果案例,分别是BGR2GrayBGR2HSV(opencv中没提供HSI,但这两个彩色空间差不多

#BGR2Gray
import cv2 as cv
def main():
	src = cv.imread("../imgs/opencv.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", src)
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    cv.imwrite('gray.png', gray)
    cv.imshow("gray", gray)
    cv.waitKey(0)
    cv.destroyAllWindows()
if __name__ == "__main__":
    main()

def main():
    src = cv.imread("../imgs/opencv.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", src)  

    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    cv.imwrite('hsv.png', hsv)
    cv.imshow("hsv", hsv)
    # 分离通道
    h, s, v = cv.split(hsv)
    cv.namedWindow("h", cv.WINDOW_NORMAL)
    cv.imshow("h", h)
    cv.namedWindow("s", cv.WINDOW_NORMAL)
    cv.imshow("s", s)
    cv.namedWindow("v", cv.WINDOW_NORMAL)
    cv.imshow("v", v)  

    cv.waitKey(0)
    cv.destroyAllWindows()  

if __name__ == "__main__":
    main()

到此这篇关于opencv+图像处理(Image Processing in OpenCV) 4-0改变颜色空间的文章就介绍到这了,更多相关opencv图像处理改变颜色空间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Opencv图像处理之详解掩膜mask

    1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩膜(masking). 我们先看一下掩膜的基础.图像的位运算. 图像基本运算 图像的基本运算有很多种,比如两幅图像可以相加.相减.相乘.相除.位运算.平方根.对数.绝对值等:图像也可以放大.缩小.旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操

  • opencv中颜色空间转换函数cv2.cvtColor()使用

    opencv中有多种色彩空间,包括 RGB.HSI.HSL.HSV.HSB.YCrCb.CIE XYZ.CIE Lab8种,使用中经常要遇到色彩空间的转化,以便生成mask图等操作. 可以使用下面的色彩空间转化函数 cv2.cvtColor( )进行色彩空间的转换: HSV 表示hue.saturation.value image_hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) 用这个函数把图像从RGB转到HSV夜色空间,注意是BGR2HSV,因为在ope

  • opencv转换颜色空间更改图片背景

    本文实例为大家分享了opencv转换颜色空间更改图片背景的具体代码,供大家参考,具体内容如下 思路: 1.将BGR转换为HSV颜色空间 2.设置掩模 3.位运算 这里以更改摩托罗拉logo背景为例,图片在必应图片搜索得知,具体代码如下: import numpy as np import cv2 from imageio import imread import matplotlib.pyplot as plt def show(img,winname = "img"): cv2.na

  • python opencv 图像处理之图像算数运算及修改颜色空间

    目录 1.图像加法 1.1Numpy加法 1.2OpenCV加法 2.图像融合 3.改变颜色空间 1.图像加法 图像加法有两种方式,一种是通过 Numpy 直接对两个图像进行相加,另一种是通过 OpenCV 的 add() 函数进行相加. 不管使用哪种方法,相加的两个图像必须具有相同的深度和类型,简单理解就是图像的大小和类型必须一致. 1.1Numpy加法 Numpy 的运算方法是: img = img1 + img2 ,然后再对最终的运算结果取模. 当最终的像素值 <= 255 时,则运算结果

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • Python+OpenCV数字图像处理之ROI区域的提取

    目录 1.实现原理 2.使用的函数简述 3.代码实现过程 (1)读入原始图像 (2)获取mask (3)获取人物mask (4)获取人物 (5)新建一张与原始图一样大小的蓝色的背景图 (6)得到蓝色背景的mask 4.整体代码  利用mask(掩模)技术提取纯色背景图像ROI区域中的人和物,并将提取出来的人或物添加在其他图像上. 1.实现原理 先通过cv.cvtColor()函数,将原RGB彩色图像转换为hsv色彩空间的图像,然后通过cv.inRange()函数获得ROI区域的Mask,最后利用

  • opencv-python 读取图像并转换颜色空间实例

    我就废话不多说了,直接上代码吧! #-*- encoding:utf-8 -*- ''' python 绘制颜色直方图 ''' import cv2 import numpy as np from matplotlib import pyplot as plt def readImage(): #读取图片 B,G,R,返回一个ndarray类型 #cv2.IMREAD_COLOR # 以彩色模式读入 1 #cv2.IMREAD_GRAYSCALE # 以灰色模式读入 0 img = cv2.im

  • opencv+图像处理(Image Processing in OpenCV) 4-0改变颜色空间的过程

    目录 0.本节涉及的opencv新函数 1.彩色的形成 2.彩色空间 3.为什么需要选择合适的彩色空间 4.如何选择合适的彩色空间 5.常用的彩色空间 RGB 6.变换彩色空间数学公式 7.opencv变换彩色空间代码+注释+效果 本专栏代码地址https://github.com/xiawei20161308104/xv_opencv_tutorials本节代码路径xv_opencv_tutorials/ImageProcessinginOpenCV/changing_colorspaces.

  • OpenCV图像处理之自定义滤波

    目录 1 空间滤波 1.1 滤波过程 1.2 相关和卷积 2 OpenCV 函数 2.1 filter2D 函数 2.2 flip 函数 3 代码示例 3.1 偏导数 参考资料 总结 图像处理中,"空间域" 指的是图像平面,因此,空间滤波可定义为:在图像平面内对像素灰度值进行的滤波 1 空间滤波 1.1 滤波过程 如图,Filter 是一个 3x3 滤波核,当它从图像的左上角开始,逐个像素沿水平方向扫描,最后到右下角时,便会产生滤波后的图像 假设输入图像 $f(x, y)$,滤波后的图

  • Opencv图像处理:如何判断图片里某个颜色值占的比例

    一.功能 这里的需求是,判断摄像头有没有被物体遮挡.这里只考虑用手遮挡---->判断黑色颜色的范围. 二.使用OpenCV的Mat格式图片遍历图片 下面代码里,传入的图片的尺寸是640*480,判断黑色范围. /* 在图片里查找指定颜色的比例 */ int Widget::Mat_color_Find(QImage qimage) { Mat image = QImage2cvMat(qimage);//将图片加载进来 int num = 0;//记录颜色的像素点 float rate;//要计

  • Python+OpenCV图像处理—— 色彩空间转换

    一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #RGB转换为GRAY 这里的GRAY是单通道的 cv.imshow("gray", gray) hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) #RGB转换为HSV cv.imshow("hsv", hsv) y

  • Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 def get_image_info(image): print(type(image)) #type() 函数如果只有第一个参数则返回对象的类型 在这里函数显示图片类型为 numpy类型的数组 print(image.shape) #图像矩阵的shape属性表示图像的大小,shape会返回tup

  • Python+OpenCV图像处理——实现轮廓发现

    简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def contours_demo(image): dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪 gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY) ret, binary = cv.threshold(gray, 0, 25

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • 基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人距离较近时,则会被判定车辆为未礼让行人. 结果示例 实验流程 先通过视频截取一张图片来进行测试,如果结果满意之后再嵌套到视频中,从而达到想要的效果. 1.预处理(灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀)> 根据自己的需求来修改一些值 #灰度值转换 imgGray = cv2.cvtColor

  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    图像素描特效 图像素描特效主要经过以下几个步骤: 调用cv.cvtColor()函数将彩色图像灰度化处理: 通过cv.GaussianBlur()函数实现高斯滤波降噪: 边缘检测采用Canny算子实现: 最后通过cv.threshold()反二进制阈值化处理实现素描特效. #coding:utf-8 import cv2 as cv import numpy as np #读取原始图像 img = cv.imread('d:/paojie.png') #图像灰度处理 gray = cv.cvtC

  • OpenCV图像处理基本操作详解

    本文实例为大家分享了OpenCV图像处理基本操作的具体代码,供大家参考,具体内容如下 图像的读取 cv2.IMREAD_COLOR 彩色图像 cv2.IMREAD_GRAYSCALE 灰色图像 import cv2#opencv 的读取格式是BGR import matplotlib.pyplot as plt import numpy as np #图像的显示,也可以创建多个窗口 img=cv2.imread('tu.jpg') cv2.imshow('name',img) #等待时间毫秒级,

随机推荐