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.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.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()
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的图像处理函数的学习。大家可以关注,点赞加收藏,一起学习,对我的文章,内容格式有什么建议,欢迎评论,私信,我会第一时间回复,谢谢大家。关注我大家一起学习进步。