色彩空间转换与HSV的简单应用---OpenCV-Python开发指南(8)

简介: 色彩空间转换与HSV的简单应用---OpenCV-Python开发指南(8)

前言


经过前面的理论知识介绍,我们已经掌握了各种色彩空间类型。本篇博文主要介绍在OpenCV中,如何用代码实现色彩空间类型的转换。


RGB与GRAY互相转换


在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间的转换。该函数色彩空间类型用枚举类型表示,其中COLOR_BGR2GRAY枚举类型就是专门提供给给RGB转GRAY的。


具体代码如下所示:

import cv2
img = cv2.imread("4.jpg", -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("rgb", img)
cv2.imshow("gray", gray)
cv2.waitKey()
cv2.destroyAllWindows()


运行之后,效果如下图所示:

接着,我们再来看看GRAY如何转换为RGB,具体代码如下所示:

import cv2
img = cv2.imread("4.jpg", 0)
bgr = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.imshow("gray", img)
cv2.imshow("rgb", bgr)
cv2.waitKey()
cv2.destroyAllWindows()


运行之后,显示效果如下图所示:

需要注意的是,RGB图像的颜色3维矩阵是BGR,所以我们转换的时候都是通过BGR2GRAY与GRAY2BGR进行的。从这里我们也可以看出来,其枚举类型常量其实非常好理解,无非就是将转换类型名称颠倒即可。


但是,我们发现灰度图像转换为RGB图像是没有变化的,因为灰度图像没有颜色值,运算不可能通过凭空想象的方式还原,但是灰度图像转RGB图像还有具有一定意义的,假如你需要上色,那么灰度图像是一个二维矩阵,它不是颜色值的三维矩阵,你是无法赋值的。而通过GRAY转RGB后,可以像操作RGB图像一样更改某个像素的颜色值,虽然它是灰色。


RGB与HSV互相转换


同上面代码类似,通过cv2.cvtColor()来转换色彩空间:


import cv2
img = cv2.imread("4.jpg", -1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("bgr", img)
cv2.imshow("hsv", hsv)
cv2.waitKey()
cv2.destroyAllWindows()


运行之后,我们会得到如下所示的图像:

在前面的理论知识中,我们可以根据色调的值获取某种颜色,也就是可以通过在HSV的H通道上的值,提取特定的颜色。这种提取分析颜色的优势可以在人脸识别中识别肤色等。


下面,我们来用蓝色试一试,具体代码如下所示:

import cv2
img = cv2.imread("4.jpg", -1)
img[:, :, 0] = 255
Blue = img
blueHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("imgBlue", Blue)
cv2.imshow("blueHSV", blueHSV)
cv2.waitKey()
cv2.destroyAllWindows()


运行之后,效果如下所示:

现在,我们来提取它的红色区域,完整代码如下所示:

import cv2
import numpy as np
img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
minBlue = np.array([0, 50, 50])
maxBlue = np.array([30, 255, 255])
# 确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
# 通过按位与获取蓝色区域
blue_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("blue", blue_img)
cv2.waitKey()
cv2.destroyAllWindows()


这里,我们用到了一个新的方法cv2.inRange(),它的定义如下所示:

def inRange(src, lowerb, upperb, dst=None):

src:表示要检查的数组或头像


lowerb:表示范围下界


upperb:表示范围上界


通过该方法,我们能判断图像内的像素点的像素值是否在某个区间。


经过前面的理论讲解,我们知道,HSV的H等于0为红色。为了兼容性,我们需要将红色的值上下扩展一些,但本身是颜色范围不能小于0,所以我们只能扩展上界限,也就是扩大30范围。


而HSV中的S通道,V通道取值范围为[100,255]。所以,这里我们为了获取到图像红色的值,将界限限定在[0, 50, 50]到[30, 255, 255]之间,运行之后,提取到了图像的红色:

从本例可以看出来,我们通过cv2.inRange()可以将图像内指定范围的值标注出来,在返回到mask中。如果图像的值位于该区间,则mask对应位置上的值为255,反之为0。然后,通过掩摸按位与运算将指定颜色取出来。


这里我们的bitwise_and有了第3个参数mask,利用掩摸(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除。

相关文章
|
9月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
887 0
|
12月前
|
机器学习/深度学习 数据采集 算法
Python AutoML框架选型攻略:7个工具性能对比与应用指南
本文系统介绍了主流Python AutoML库的技术特点与适用场景,涵盖AutoGluon、PyCaret、TPOT、Auto-sklearn、H2O AutoML及AutoKeras等工具,帮助开发者根据项目需求高效选择自动化机器学习方案。
1441 1
|
10月前
|
数据采集 监控 Java
Python 函数式编程的执行效率:实际应用中的权衡
Python 函数式编程的执行效率:实际应用中的权衡
416 102
|
11月前
|
存储 数据可视化 BI
Python可视化应用——学生成绩分布柱状图展示
本程序使用Python读取Excel中的学生成绩数据,统计各分数段人数,并通过Matplotlib库绘制柱状图展示成绩分布。同时计算最高分、最低分及平均分,实现成绩可视化分析。
861 0
|
机器学习/深度学习 数据可视化 算法
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
407 0
|
9月前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
684 6
|
9月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
616 0
|
10月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
536 0
|
11月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
722 1
|
10月前
|
存储 程序员 数据处理
Python列表基础操作全解析:从创建到灵活应用
本文深入浅出地讲解了Python列表的各类操作,从创建、增删改查到遍历与性能优化,内容详实且贴近实战,适合初学者快速掌握这一核心数据结构。
740 0

推荐镜像

更多