1 色彩空间转换
在数字图像中,最常见的彩色模型是RGB模型(红、绿、蓝,在OpenCV中彩色图像组织 的顺序是B-G-R,仍然是RGB模型。
这种模型是硬件处理的常用模型,比如采集图像的 CCD传感器、显示图像的显示器等等。
符合描述人类眼睛观察的则是HSV(色度、饱和度、亮度)模型。
OpenCV中有374种颜色空间转换方法。我们只研究两种最广泛使用的转换方法, BGR↔Gray和BGR↔HSV。
import cv2
flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
len(flags)
1.1 转换GRAY色彩空间
GRAY色彩空间:GRAY(灰度图像)通常指8位灰度图,其具有256个灰度级,像素值的 范围是[0,255]。
当图像由RGB色彩空间转换为GRAY色彩空间时,其处理方式如下: Gray=0.299R+0.587G+0.114*B
对于颜色转换,使用函数cv.cvtColor(input_image,flag),其中flag确定转换类型。
对于BGR→Gray转换,我们使用标志cv.COLOR_BGR2GRAY。 类似地,对于BGR→HSV,我们使用标志cv.COLOR_BGR2HSV。
import cv2
img_src = cv2.imread("./images/lena.jpg")
img_gray = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) #彩色转灰度
print(img_gray.shape) #单通道
img_color = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) #灰度转彩色
print(img_color.shape) #3通道
cv2.imshow('img_src',img_src)
cv2.imshow('img_color',img_color)
cv2.imshow('img_gray',img_gray)
cv2.waitKey()
cv2.destroyAllWindows()
在彩色图像转换到灰度图像后,再用该灰度图转换回彩色图像只是名义上多通道的彩色图像,人眼看到的却不是“彩 色”了。 applyColorMap(),它可以将灰度图像转换成彩色图像,转换的模式达22种之多。
import cv2
img_gray = cv2.imread("./images/lena.jpg",0)
for i in range(22):
dst = cv2.applyColorMap(img_gray,i)
cv2.imshow('map',dst)
cv2.waitKey(500)
# cv2.imwrite("map-"+str(i)+".jpg",dst)
cv2.destroyAllWindows()
1.2 转换到HSV空间
HSV色彩空间 RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异,
HSV色彩空间是一种面向视觉感知的颜色模型 指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度 (Saturation)、亮度(Value)。
注意 HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为 [0,255]。
不同的软件使用不同 的规模。因此,如果你要将OpenCV值 和它们比较,你需要将这些范围标准化。
色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8,8)
plt.rc('font', size=14)
plt.rc('axes', labelsize=14, titlesize=14)
plt.rc('legend', fontsize=14)
plt.rc('xtick', labelsize=10)
plt.rc('ytick', labelsize=10)
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def plot_multiple_imgs(titles,images,hspace=0.1):
import math
for i in range(len(titles)):
plt.subplot(2, math.ceil(len(titles)/2), i + 1), plt.imshow(cv2.cvtColor
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.subplots_adjust(wspace =0.1, hspace =hspace)#调整子图间距
plt.show()
import cv2
import matplotlib.pyplot as plt
# 定义plot_multiple_imgs函数
def plot_multiple_imgs(images, titles):
fig, axes = plt.subplots(1, len(images), figsize=(15, 5))
for i, ax in enumerate(axes):
ax.imshow(images[i])
ax.set_title(titles[i])
ax.axis('off')
plt.show()
# 读取图像
img = cv2.imread("./images/lena.jpg")
# 将图像从BGR颜色空间转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 显示图像
plot_multiple_imgs([img, img[:,:,::-1], hsv], ['RGB', 'img', 'HSV'])
1.3 HSV空间-物体跟踪
通过cv2.inRange()可以将图像内指定范围的值标注出来,在返回到mask中。
如果图像的值位于该区间,则mask对应位置上的值为255,反之为0。 通过掩摸按位与运算将指定颜色取出来。
bitwise_and有了第3个参数mask,利用掩摸(mask)进行“与”操作 即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔 除。
图片下载地址:点击
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义plot_multiple_imgs函数
def plot_multiple_imgs(images, titles):
fig, axes = plt.subplots(1, len(images), figsize=(15, 5))
for i, ax in enumerate(axes):
ax.imshow(images[i])
ax.set_title(titles[i])
ax.axis('off')
plt.subplots_adjust(hspace=0.5) # 调整子图之间的垂直间距
plt.show()
img = cv2.imread("./images/qiu.jpg")
# 定蓝色的阈值
lower_1 = np.array([102, 100, 100])
upper_1 = np.array([122, 255, 255])
#黄色-乒乓球
lower = np.array([15, 100, 100])
upper = np.array([30, 255, 255])
# 换到 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 根据阈值构建掩模
mask = cv2.inRange(hsv, lower_1, upper_1)
# 对原图像和掩模位运算
res = cv2.bitwise_and(img, img, mask=mask)
# 显示图像
plot_multiple_imgs([img, hsv, mask, res], ['Original', 'HSV', 'Mask', 'Result'])