HSV颜色分割,RGB与HSV颜色空间的关系

1前言

在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。

而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何。第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚HSV与RGB的关系,建立直观的印象是很有必要的。
图像处理–RGB与HSI颜色模型的转换方法介绍
这篇博客写的很全

  1. 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

在这里插入图片描述

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值