顏色空間探究:RGB、HSV和HSL
阿新 • • 發佈:2018-12-05
從RGB空間說起
所謂RGB空間就是red,green和blue顏色3個向量張成的空間,正好類似於3維歐氏空間。
如圖所示,3個向量均歸一化了,其中(0,0,0)處為黑色,(1,1,1)處為白色。這種對映關係和光學稜鏡色散和疊加相對應。實際應用常用的在[0, 255]區間編碼。
簡單的例子:RGB空間(0,0,255)為純藍色,(255,0,0)為純紅色。
舉慄
import cv2 import matplotlib.pyplot as plt from scipy.signal import convolve2d import numpy as np img = cv2.imread('monalisa.jpg') plt.figure() plt.imshow(img)
這個蒙娜麗莎有點奇怪,原來是opencv的介面使用BGR,而matplotlib.pyplot 則是RGB模式。如下程式碼將顏色空間重排。
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.figure()
plt.imshow(img2)
plt.axis('off')
這才是正常的蒙娜麗莎,使用cv2.cvtColor()函式也能實現顏色轉換
img3=cv2.cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.figure() plt.imshow(img3) plt.axis('off')
函式名cvt即convert。而且引數很簡單,就一個int型引數:
>>>cv2.COLOR_BGR2RGB
4
彩色影象轉化為灰度影象
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure()
plt.imshow(gray,cmap='gray')
plt.axis('off')
>>>cv2.COLOR_BGR2GRAY
6
點評:顏色空間有很多種,如“秋天”,“冬天”,‘jet’,‘hot’等,類似Matlab的colormap。
反色
def inverse_color(image):
height,width,temp = image.shape
img2 = image.copy()
for i in range(height):
for j in range(width):
img2[i,j] = (255-image[i,j][0],255-image[i,j][1],255-image[i,j][2])
return img2
img4=inverse_color(img)
plt.figure()
plt.imshow(img4)
plt.axis('off')
def inverse_gray(image):
height,width = image.shape
img2 = image.copy()
for i in range(height):
for j in range(width):
img2[i,j] = (255-image[i,j])
return img2
img5=inverse_gray(gray)
plt.figure()
plt.imshow(img5,cmap='gray')
plt.axis('off')
彩色轉灰度影象還能用深度學習中的1×1卷積實現,思路就是3通道加權疊加成1通道。
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.144])
img6 = rgb2gray(img)
plt.figure()
plt.imshow(img6,cmap='gray')
HSV和HSL
HSL 表示hue(色相)、saturation(飽和度)、lightness(亮度),HSV表示hue、saturation、value(色調)。
如圖所示,這兩個空間基於柱座標系統,那麼調節3個分量的值,可遍歷不同風格的渲染顏色。