opencv之颜色空间变换

彩色空间互转

RGB空间

RGB(红绿蓝)是根据人眼识别的颜色定义出的空间,可表示大部分颜色。 RGB颜色空间是基于颜色的加法混色原理,从黑色不断叠加Red,Green,Blue的颜色,最终可得到白色光

HSV颜色空间

HSV是一种将RGB色彩空间的点在倒圆锥体中的表示方法

H(Hue)[色相]:色相是色彩的基本属性,相当于颜色的名称
S(Saturation)[饱和度]:色彩的纯度【深浅】,值越高色彩越纯,值越低则逐渐变灰,取0-100%的数值
V(Value)[明度]:取0-max【计算机hsv的取值范围与存储长度有关】
HSV空间用圆锥空间描述,圆锥顶点处V=0,H和S无定义,代表黑色。圆锥顶面中无定义V=max,S=0,H无定义,代表白色

opencv关于颜色空间的转换

函数: cv2.cvtColor(input_img,flag)

flag : 
    cv2.COLOR_BGR2GRAY-------彩色空间转灰度空间
    cv2.COLOR_BGR2HSV--------彩色空间转HSV空间
    ...

 

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('happy.jpeg',-1)[:,:,::-1]
img_Gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)[:,:,::-1]

titles = ['raw','Gary','HSV']
imgs = [img,img_Gray,img_HSV]
plt.figure(figsize=(20,11))
for i in range(3):
    plt.subplot(1,3,i+1),plt.title(titles[i])
    if i==1:
        plt.imshow(imgs[i],'gray')
    else:
        plt.imshow(imgs[i])

 

### 用HSV空间只把图片的黄色字段挑出来

# 图片转换成HSV空间
img_HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)[:,:,::-1]

## 设置黄色色阈值
low_yellow = np.array([180,180,50])
upper_yellow = np.array([240,255,110])

### 设置黄色掩膜矩阵
mask = cv2.inRange(img_HSV,low_green,upper_green)

#### 对原图与掩膜进行位运算
yellow_only = cv2.bitwise_and(img_HSV,img_HSV,mask=mask) 

titles = ['HSV','mask','yellow_only']
imgs = [img_HSV,mask,yellow_only]
plt.figure(figsize=(20,11))
for i in range(3):
    plt.subplot(1,3,i+1),plt.title(titles[i]),plt.imshow(imgs[i])

附录,不用opencv的python实现

RGB转灰度图

公式:Gary=R∗0.299+G∗0.587+B∗0.114Gary=R∗0.299+G∗0.587+B∗0.114


def RGBToGRAY(src,fast_methods=True):
    rows,cols,channels = src.shape
    ### opencv 是BGR通道的
    B,G,R = src[:,:,0],src[:,:,1],src[:,:,2]
    dst = np.zeros((rows,cols))
    if fast_methods==False:
        dst = R*0.299 + G*0.587 + B*0.114
    else :
        #采用移位加快速度
        dst = (R * 4898 + G * 9618 + B * 1868) >> 14
    return dst

img = cv2.imread('happy.jpeg')
plt.imshow(RGBToGRAY(img,fast_methods=True),'gray')

 

 

RGB转HSV

def RGBToHSV(src):
    rows,cols,channels = src.shape
    ### opencv 是BGR通道的
    B,G,R = src[:,:,0]/255.0,src[:,:,1]/255.0,src[:,:,2]/255.0
    dst = np.zeros(src.shape)+0.0
    
    for i in range(rows):
        for j in range(cols):
            # 求解h
            h,s,v = 0.0,0.0,0.0
            r,g,b = R[i,j],G[i,j],B[i,j]
            max_rgb,min_rgb = max(r,max(g,b)),min(r,min(g,b))
            dif_rgb = max_rgb-min_rgb
            if(max_rgb==min_rgb):
                h = 0
            elif max_rgb==r:
                h = (g-b)/dif_rgb + (0 if g>=b else 6)
            elif max_rgb==g:
                h = (b-r)/dif_rgb + 2
            elif max_rgb==b:
                h = (r-g)/dif_rgb + 4
            h*=60
            if h<0:
                h+=360
            ## 求解s
            
            if max_rgb==0:
                s = 0
            else :
                s = 1-(min_rgb/max_rgb)
            
            ### 求解v
            v = max_rgb
            dst[i,j,0],dst[i,j,1],dst[i,j,2] = h,s,v
    return dst
            
img = cv2.imread('happy.jpeg')
plt.imshow(RGBToHSV(img))
 

 

HSV 转RGB

def HSVToRGB(src):
    rows,cols,channels = src.shape
    H,S,V = src[:,:,0].reshape(rows*cols),src[:,:,1].reshape(rows*cols),src[:,:,2].reshape(rows*cols,1)
    dst = np.zeros((rows*cols,3))
    
    H_i = (np.floor(H/60))%6
    
    f = H/60 - H_i
    p = V*(1-S).reshape(rows*cols,1)
    q = V*(1-f*S).reshape(rows*cols,1)
    t = V*(1-(1-f)*S).reshape(rows*cols,1)
    
    dst[H_i==0,:] = np.hstack([V[H_i==0,:],t[H_i==0,:],p[H_i==0,:]])
    dst[H_i==1,:] = np.hstack([q[H_i==1,:],V[H_i==1,:],p[H_i==1,:]])
    dst[H_i==2,:] = np.hstack([p[H_i==2,:],V[H_i==2,:],t[H_i==2,:]])
    dst[H_i==3,:] = np.hstack([p[H_i==3,:],q[H_i==3,:],V[H_i==3,:]])
    dst[H_i==4,:] = np.hstack([t[H_i==4,:],p[H_i==4,:],V[H_i==4,:]])
    dst[H_i==5,:] = np.hstack([V[H_i==5,:],p[H_i==5,:],q[H_i==5,:]])
    dst[S==0,:] = np.hstack([V[S==0,:],V[S==0,:],V[S==0,:]])
    
    return dst.reshape(src.shape)
                        
                  
img = cv2.imread('happy.jpeg')

plt.imshow(HSVToRGB(RGBToHSV(img)))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值