13. OpenCV图像的颜色空间转换(含代码详细注释)

本文介绍了使用OpenCV进行图像颜色空间转换(如BGR到灰度或HSV),并通过cv2.cvtColor()和cv2.inRange()函数实现特定颜色物体检测,以及物体跟踪技术,如HSV阈值选择和位运算。这些基础技巧为后续的图像处理和计算机视觉应用打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13. OpenCV图像的颜色空间转换

13.1 转换颜色空间

学习目标

• 我们将学习如何对图像的颜色空间转换比如从 BGR 到灰度图或者从
BGR 到 HSV 等等。
•编写一段程序从摄像头或者图像中获取特定颜色的物体。
• 我们将学习的函数有cv2.cvtColor()和cv2.inRange()等等。

# 13.1 转换颜色空间
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
# 计算每行打印的个数
chunk_size = 5
# 遍历flags列表,每次取三个元素进行打印,然后换行
for i in range(0, len(flags), chunk_size):
    print(*flags[i:i + chunk_size])
# 查看cv2.cvtColour(input_image,flag)其中flag的转换类型
input_image = cv2.imread('pingpangqiu.JPG')
output_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
cv2.imshow('img',output_image)
cv2.waitKey(0)

原图13.1

13.2 物体跟踪

# 13.2 物体跟踪
# 从视频中获取每一帧图像,将图像转换到HSV空间,设置HSV阈值到蓝色范围。
# 下面代码我改了一点是从图片中获取识别,后面带*号的代码注释掉,取消之前被注释的代码,改为从摄像头获取图像
import cv2
import numpy as np
#cap= cv2.VideoCapture(0)#
image_path = "pingpangqiu.JPG"  # * 
img = cv2.imread(image_path) # *
while(1):
    # 获取每一帧
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # *
    #ret,frame = cap.read()
    # 转换到HSV
    #hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    # 设定蓝色的阈值,是指在HSV颜色空间中的颜色上限与下限
    #lower_blue = np.array([110,50,50]) # 这里识别蓝色
    #upper_blue = np.array([130,255,255])
    #lower_white = np.array([0, 0, 200]) # 这里识别白色
    #upper_white = np.array([180, 255, 255])
    lower_yellow = np.array([20, 100, 100]) # 这里识别黄色
    upper_yellow = np.array([35, 255, 255])

    # 根据阈值构建掩膜
    mask = cv2.inRange(hsv,lower_yellow,upper_yellow)
    # 对原图像和掩膜进行位运算
    res = cv2.bitwise_and(hsv,hsv,mask=mask)
    cv2.imshow('frame',img)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5)&0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

13.2

13.3 找到要跟踪对象的HSV值

# 13.3 找到要跟踪对象的HSV值
import cv2
import numpy as np
# 读取图像
image = cv2.imread('pingpangqiu.JPG')
# 将图像从BGR转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义要查找的颜色范围(这里以红色为例)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
# 创建一个掩码,用于标记图像中红色区域的像素
mask = cv2.inRange(hsv_image, lower_red, upper_red)
# 对原始图像应用掩码,只保留红色区域
result = cv2.bitwise_and(image, image, mask=mask)
# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

13.3

import cv2
import numpy as np
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
#np.uint8: 这是NumPy库中的一个函数,用于创建指定数据类型的数组。在这里,它被用来创建一个无符号8位整数(即每个元素的范围是0到255)的数组。

#[[[0, 255, 0]]]: 这是创建数组的内容。在这个例子中,我们只有一个元素,它是一个三维数组,其形状为(1, 1, 3)。这个三维数组表示一个像素,其中第一个维度表示图像的高度或宽度(在这里是1),第二个维度表示图像的颜色通道(在这里也是1,因为我们只关心一个颜色通道),第三个维度表示颜色的三个分量(在这里是RGB,所以有三个分量)。

#0, 255, 0: 这是RGB颜色模型中的绿色。在RGB模型中,每种颜色由三个分量表示:红色、绿色和蓝色。在这里,我们将红色和蓝色设置为0,将绿色设置为255,表示这是一个绿色的像素。
print(hsv_green)```
# 小结
通过对OpenCV的cv2.cvtColor()cv2.inRange()函数让我们对OpenCV有了一定的了解,对这些基础函数的学习,会为我们将来学习关于OpenCV的图像分割,人脸识别,道路场景识别项目打下坚实的基础。之后我会不断的系统的分享关于我对OpenCV的图像处理函数的学习。大家可以关注,点赞加收藏,一起学习,对我的文章,内容格式有什么建议,欢迎评论,私信,我会第一时间回复,谢谢大家。关注我大家一起学习进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值