彩色空间互转
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)))