1. 程式人生 > >顏色空間探究:RGB、HSV和HSL

顏色空間探究:RGB、HSV和HSL

從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個分量的值,可遍歷不同風格的渲染顏色。