1前言
在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。
而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何。第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚HSV与RGB的关系,建立直观的印象是很有必要的。
图像处理–RGB与HSI颜色模型的转换方法介绍
这篇博客写的很全
- RGB模型。
原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。
用RGB来理解色彩、深浅、明暗变化:
色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离
明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮
PS: 光学的分析
三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。
只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”
2.HSV空间
HSV颜色空间模型是倒锥形模型:
这个模型是按色调、饱和度、明暗来描述的。
H值代表色调、S值代表饱和度、V值代表亮度。
在圆锥上,角度代表色调H,饱和度S表示为点到中心竖线的距离,而亮度值V用中心竖线表示。
HSV对用户来说是一种直观的颜色模型。我们可以从一种纯彩色开始,即指定彩色角H,并让V=S=1,然后我们就可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小v而s不变,同样增加白色可以减小S而V不变。例如,要想得到深蓝色,V=0.4 S=1 H=240,要想得到淡蓝色,V=1 S=0.4 H=240.
HSV在用于指定颜色分割时,有比较大的作用。
颜色对应的图像分割,需要将1号颜色所对应的H值,S值,V值的阈值逼近出来,2号颜色对应区域的H值,S值,V值的阈值确逼近出来,3号颜色对应区域的H值,S值,V值的阈值逼近出来。
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 27 16:28:30 2019
在想要分割的物体上用鼠标单击几下,然后按任意键退出。
@author: yuan
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("./Images/lvse.jpg")
lower=np.array([255,255,255])
upper=np.array([0,0,0])
def read_rgb(event,x,y,flags,param):
global lower,upper
if event==cv2.EVENT_LBUTTONDBLCLK:
print('rgb',img[x,y])# 创建图像与窗口并将窗口与回调函数绑定
hsv_color=cv2.cvtColor(np.uint8([[img[x,y]]]),cv2.COLOR_BGR2HSV)
print('hsv',hsv_color[0][0])
new_hsv=np.array([list(hsv_color[0][0]),list(lower)])
print('new_hsv',new_hsv)
lower=np.min(new_hsv,axis=0)
new_hsv=np.array([list(hsv_color[0][0]),list(upper)])
print('new_hsv',new_hsv)
upper=np.max(new_hsv,axis=0)
print('lower:',lower,'upper:',upper)
cv2.namedWindow('image')
cv2.setMouseCallback('image',read_rgb)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)&0xFF==27: #ESC to quit!!!!1
cv2.destroyAllWindows()
break
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 根据阈值构建掩模
mask=cv2.inRange(hsv,lower,upper)
# 对原图像和掩模进行位运算
res=cv2.bitwise_and(img,img,mask=mask)
plt.figure(1)
#第一行第一列图形
img_show=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #change BGR to RGB before show it
ax1 = plt.subplot(1,3,1)
plt.sca(ax1)
plt.imshow(img_show)
plt.title("artwork")
#第一行第二列图形
ax2 = plt.subplot(1,3,2)
plt.sca(ax2)
plt.imshow(mask,cmap="gray")
plt.title("mask")
#第一行第3列图形
res_show=cv2.cvtColor(res,cv2.COLOR_BGR2RGB) #change BGR to RGB before show it
ax3 = plt.subplot(1,3,3)
plt.sca(ax3)
plt.imshow(res_show)
plt.title("reault")
plt.show()
参考
【1】https://blog.csdn.net/zuoanhuahai/article/details/80989441