图像“颜色选择”怎么用?
我們來看一個簡單的需求,比如說下面這幅圖像:
這是一幅公路上的行車圖像,假如我們想把車道線提取出來,該怎么辦呢?
我們觀察,發(fā)現(xiàn)車道線是黃色的或者白色的。那么我們想到的是可以把行車圖像中的黃色顏色和白色顏色提取出來。
我們知道,在RGB顏色模式中,白色是[255,255,255],黃色是[255,255,0]。但是行車圖像中的白色和黃色可不完全是純白色和純黃色。因此,需要在一定的范圍內(nèi)選擇。
import cv2 import numpy as np img = cv2.imread("lane_lines.jpg") # yellow and white color selection lower_white = np.array([200, 200, 200]) upper_white = np.array([255, 255, 255])lower_yellow = np.array([200, 200, 0]) upper_yellow = np.array([255, 255, 50])white = cv2.inRange(img, lower_white, upper_white) yellow = cv2.inRange(img, lower_yellow, upper_yellow)cv2.imshow("white", white) cv2.imshow("yellow", yellow)cv2.imwrite("white.png", white) cv2.imwrite("yellow.png", yellow) cv2.waitKey()
上圖為提取的白色顏色,下圖為提取的黃色顏色。我們可以看到。白色提取出來了,但黃色并沒有提取出來。這是因?yàn)镽GB顏色模型的局限性,需要R/G/G三個值協(xié)同配合才能混合成顏色,這意味著需要考慮至少2個變量的配比問題,非常的麻煩。
所以,通過RGB顏色模型進(jìn)行顏色選擇的難度非常大。
那有沒有其它辦法呢?我們知道,RGB只是顏色表達(dá)模型中的一種,雖然是最常見的一種。但還有其它顏色表達(dá)模型,例如HSV /HSL等。
我們看看HSV顏色模型。H表示色度,S表示飽和度,V表示亮度。與RGB一樣,也是3個分量。但H分量是唯一與顏色本質(zhì)相關(guān)的分量,只要固定了H值范圍,那么表現(xiàn)的顏色就會基本固定。白色和黑色則主要通過調(diào)整飽和度S和亮度V來實(shí)現(xiàn),很顯然,白色最亮,黑色最暗。
當(dāng)然,用HSV取顏色的前提是圖像是用HSV表示的,用OpenCV轉(zhuǎn)換下。
img = cv2.imread("lane_lines.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # yellow and white color selection lower_white = np.array([0, 0, 200]) upper_white = np.array([180, 40, 255])lower_yellow = np.array([15, 50, 50]) upper_yellow = np.array([35, 255, 255])white = cv2.inRange(img, lower_white, upper_white) yellow = cv2.inRange(img, lower_yellow, upper_yellow)cv2.imshow("white", white) cv2.imshow("yellow", yellow) cv2.waitKey()
上圖為提取的白色顏色區(qū)域,下圖為提取的黃色顏色區(qū)域,可以看到這次黃色區(qū)域被提取出來了。可以很明顯的看到車道線了。當(dāng)然,你也可以轉(zhuǎn)換成HSL顏色空間來取顏色。
同樣,如果我們在繪圖時,需要隨機(jī)選擇顏色怎么辦呢?例如繪制10種不同的曲線,隨機(jī)選擇10種不同的顏色進(jìn)行繪制。用RGB顏色空間隨機(jī)選擇當(dāng)然是可以的。例如R、G、B分別在[0,255]之間進(jìn)行隨機(jī),但是這樣得到的顏色不太友好,有時偏暗,有時外觀不佳。
而在HSV顏色空間中,可以只對色度H進(jìn)行隨機(jī),而飽和度S和亮度V都用最高值,這樣隨機(jī)得到的顏色會更加鮮艷明亮。
import matplotlib.pyplot as plt num_color = 9 height, width = 100, 100 colors = [] for i in range(num_color):hsv = np.zeros((height, width, 3), dtype=np.uint8)hsv[hsv >= 0] = 255hsv[:, :, 0] = int(i / num_color * 180)RGB = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)plt.subplot(3, 3, i + 1)plt.imshow(RGB)plt.axis("off") plt.show()總結(jié)
以上是生活随笔為你收集整理的图像“颜色选择”怎么用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像旋转变换的推导
- 下一篇: 图像“位操作”有什么用?