您现在的位置是:首页 >技术交流 >OpenCv更改颜色空间以及图像阈值网站首页技术交流

OpenCv更改颜色空间以及图像阈值

He_xj 2024-06-14 17:19:07
简介OpenCv更改颜色空间以及图像阈值
本文主要讲解以下几个方面:
  • 如何将图片从一个颜色空间转换到另一个,例如 BGR 到 Gray,BGR 到 HSV 等。
  • 简单阈值法
  • 另外,我们会创建一个从图片中提取彩色对象的应用。
1.改变颜色空间

cv.cvtColor(img, flag)

  • 参数flag表示颜色空间转换的方法,常用的方法为BGR -> GRAY以及BGR -> HSV这两种图像空间转换的方法其flag对应的指令分别为cv.COLOR_BGR2GRAYcv.COLOR_BGR2HSV

如果想查看其它flag属性的话可以在python终端输入如下代码执行,如图所示(部分)

import cv2
flags = [i for i in dir(cv2) if i.startsWith('COLOR_')]
print(flags)

在这里插入图片描述

Attention: 对于 HSV, 色调(Hue)范围为 [0,179], 饱和度(Saturation)范围为 [0,255] ,明亮度(Value)为 [0,255]. 不同的软件使用不同的比例. 所以如果你想用 OpenCV 的值与别的软件的值作对比,你需要归一化这些范围

2. 图像的阈值操作

cv.threshold(src, thresh, maxval, type)函数

  • src 阈值处理的图像文件 它应该是灰度图像
  • thresh 界限值, 用于对像素值进行分类
  • maxval 它表示像素值大于(有时小于)阈值时要给定的值
  • type不同阈值类型

type主要使用以下几种:

cv.THRESH_BINARY
cv.THRESH_BINARY_INV
cv.THRESH_TRUNC
cv.THRESH_TOZERO
cv.THRESH_TOZERO_INV

其他的可以前往官方文档中查看传送门

  1. 简单阈值法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('gradient.png',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in xrange(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述
其他阈值法请查看文档
https://opencv.apachecn.org/#/docs/4.0.0/4.3-tutorial_py_thresholding

3. 提取图片中的色彩

现在我们知道了如何将 BGR 图片转化为 HSV 图片,我们可以使用它去提取彩色对象。HSV 比 BGR 在颜色空间上更容易表示颜色。在我们的应用中,我们会尝试提取一个蓝色的彩色对象,方法为:

track = cv.imread('images/track.jpg')
# 将颜色空间由BGR转化为HSV
hsv = cv.cvtColor(track, cv.COLOR_BGR2HSV)
# 设置提取颜色的范围
lower_blue = np.array([100,50,50])
upper_blue = np.array([140,255,255])
# 将蓝色以外的颜色通过阈值处理
mask = cv.inRange(hsv, lower_blue, upper_blue)
# 将处理后的图像和原图像进行位-与运算
res = cv.bitwise_and(track,track, mask= mask)
ret = np.hstack((track, res))
cv.imshow('result', ret)
cv.waitKey(0)
cv.destroyAllWindows()

结果如图:在这里插入图片描述
参考:opencv4.0 中文文档以及英文文档
感谢阅读!!!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。