python+opencv系列教程(5)——色彩空间2

  • A+
所属分类:大数据

1     原理

OpenCV中,颜色提取的一种方式是将BGR空间下的图像转换为HSV空间下,然后利用OpenCV自带函数inRange,设置需提取的HSV各分量上下限,从而进行提取

这里给出HSV对应BGR颜色的表格:

python+opencv系列教程(5)——色彩空间2

2     代码

  1. import cv2 as cv
  2. import numpy as np
  3. def extract_object_demo():
  4.     capture = cv.VideoCapture(0)
  5.     while True:
  6.         ret, frame = capture.read()
  7.         if not ret:
  8.             break
  9.         hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
  10.         lower_hsv = np.array([0, 0, 0])
  11.         up_hsv = np.array([180, 255, 46])  # 黑色所在范围
  12.         mask = cv.inRange(hsv, lower_hsv, up_hsv)
  13.         cv.imshow("video", frame)
  14.         cv.imshow("mask", mask)
  15.         c = cv.waitKey(40)
  16.         if 27 == c:
  17.             break
  18. print("start")
  19. src = cv.imread("C:/Users/Admin/Desktop/1.jpg")  # 读取图像
  20. cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  # 创建显示图像的窗口
  21. cv.imshow("input image", src)  # 显示图片到特定的窗口中
  22. b, g, r = cv.split(src)
  23. cv.imshow("blue", b)
  24. cv.imshow("green", g)
  25. cv.imshow("red", r)
  26. src = cv.merge([b, g, r])
  27. cv.imshow("merge image", src)
  28. src[:, :, 0] = 0
  29. cv.imshow("delete blue", src)
  30. extract_object_demo()
  31. cv.destroyAllWindows()  # 释放所有内存

3     讲解

  • 从print("start")开始,读取一张jpg图片,并调用imshow方法将原始图像显示在"input image"窗口中;调用split方法,将rgb图像分成r、g、b三个通道,并单独显示出来,效果如图所示

python+opencv系列教程(5)——色彩空间2

从结果图中看出,blue窗口中,原图中存在蓝色的区域为白色和灰色,没有蓝色地方为黑色;其余通道结果相同。

  • 将三个通道的数据通过merge函数合并到一起时,又可以恢复到原来的图像
  • src[:, :, 0] = 0将图像中所有像素点中,blue通道数据置为0,相当于在原图中删除蓝色通道
  • extract_object_demo()用于从图像中提取特定颜色区域。cv.VideoCapture(0)打开笔记本的摄像头,循环读取摄像头的每一帧图像,cvtColor将rgb图像转换为hsv模式,lower_hsv和up_hsv为hsv/rgb对应表中黑色的取值范围,调用inRange方法取出黑色区域,inRange方法会将在区域内的像素设置为255,不在区域内的像素设置为0;if 27 == c:按下esc键退出。
Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!