訂閱
糾錯
加入自媒體

如何利用Python+OpenCV的色彩過濾和色彩流行效果

你曾經(jīng)想過從圖像中分離單一色調(diào)嗎?本文介紹了使用OpenCV python從常規(guī)RGB圖像中過濾特定顏色的過程。讓我們開始吧。

色調(diào)在開始過濾顏色之前,最好對色調(diào)有一個基本的了解。這是維基百科上關(guān)于色調(diào)的定義之一在顏色理論中,色調(diào)是一種顏色的主要屬性(稱為顏色外觀參數(shù)),在CIECAM02模型中技術(shù)上定義為“刺激可描述為與紅色調(diào)似或不同的程度” ,橙色,黃色,綠色,藍色,紫色”,在某些色覺理論中被稱為獨特的色調(diào)。我知道這聽起來很難以理解,但讓我給你解釋一下!按碳ぁ边@個詞在這里的意思是當(dāng)我們看到一個物體時到達我們眼睛的光,F(xiàn)在讓我重新定義一下。我們看到的所有顏色,都可以被解釋為紅、橙、黃、綠、藍、紫這些顏色的變體,在某些色彩視覺理論中,這些顏色被稱為獨特的色調(diào)。總而言之,色調(diào)是原色和次色最純粹的形式。一般來說,色調(diào)是按顏色圈的360度來衡量的,但在OpenCV中,色調(diào)尺度只有180度。HSV(色調(diào),飽和度,值)就像我們用來表示RGB和BGR等圖像的最常見顏色空間一樣,HSV也是一個顏色空間,其中H表示色調(diào),S表示飽和度,V表示值。因為我們已經(jīng)知道什么是色調(diào),讓我們看看飽和度和值飽和度飽和度使顏色變得純凈。純色中沒有灰色。顏色中混合的灰色越多,飽和度越低。飽和度值通常從0到100%測量,但在OpenCV中,飽和度的范圍是從0到255。值這是一種顏色亮度的量度。當(dāng)亮度值最大時,顏色變?yōu)榘咨,?dāng)亮度值最小時,顏色變?yōu)楹谏。這通常是0到100%,但在OpenCV中,值的范圍是從0到255,F(xiàn)在讓我們采取一些實際行動。過濾顏色為了使用OpenCV過濾顏色,我們必須指定顏色的色調(diào)范圍,我們需要過濾,并為顏色創(chuàng)建一個遮罩。然后利用遮罩對原始圖像陣列(本文將詳細(xì)討論)進行按位與運算,得到濾波后的顏色結(jié)果。讓我們嘗試從下圖中過濾出綠色:

從上圖中濾除綠色的代碼為:#import the libraries
import cv2 as cv
import numpy as np
#read the image
img = cv.imread("D://medium_blogs//flower.jpg")
#convert the BGR image to HSV colour space
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
#set the lower and upper bounds for the green hue
lower_green = np.a(chǎn)rray([50,100,50])
upper_green = np.a(chǎn)rray([70,255,255])
#create a mask for green colour using inRange function
mask = cv.inRange(hsv, lower_green, upper_green)
#perform bitwise and on the original image arrays using the mask
res = cv.bitwise_and(img, img, mask=mask)
#create resizable windows for displaying the images
cv.namedWindow("res", cv.WINDOW_NORMAL)
cv.namedWindow("hsv", cv.WINDOW_NORMAL)
cv.namedWindow("mask", cv.WINDOW_NORMAL)
#display the images
cv.imshow("mask", mask)
cv.imshow("hsv", hsv)
cv.imshow("res", res)
if cv.waitKey(0):
   cv.destroyAllWindows()
上述代碼片段的結(jié)果是:

HSV圖像蒙版

只有綠色的最終圖像

使用色彩過濾的概念創(chuàng)建色彩流行效果現(xiàn)在我們知道了如何創(chuàng)建顏色過濾器,讓我們看看如何使用OpenCV創(chuàng)建彩色流行效果。讓我們使用下面的圖像來演示這一點。

創(chuàng)建紅色彈出濾鏡的流程如下:
讀取圖像并將其轉(zhuǎn)換為HSV格式。設(shè)置要過濾的紅色HSV的下界和上界。查找顏色的HSV顏色空間值的一種方法是運行以下代碼片段。img = np.uint8([[[0,0,255]]])
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
print(hsv)
OpenCV以BGR格式讀取圖像,這就是為什么紅色是[0,0,255]。上面的代碼片段打印如下:[[0 255 255]]
它是紅色的HSV值(色調(diào)- 0,飽和度- 255(100%),值- 255(100%)。你還可以對圖像中的特定像素做同樣的工作,以找到該像素的HSV值。pixel = img[3124, 2342]
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
print(hsv)
因為我們知道我們現(xiàn)在試圖過濾的顏色的HSV值,我們可以根據(jù)我們的需要分別調(diào)整色調(diào),飽和度和值來設(shè)置上界和下界。使用OpenCV的inRange函數(shù)為紅色色調(diào)創(chuàng)建一個遮罩。使用遮罩上的bitwise_not操作創(chuàng)建遮罩的逆遮罩。使用遮罩(前景)只過濾原始圖像的紅色部分。使用cv.cvtColor函數(shù)獲取原始圖像的灰度格式,F(xiàn)在使用遮罩的反面從灰度圖像(背景)中只過濾原始圖像中包含紅色以外的顏色的區(qū)域。在將背景添加到前景之前,必須使用numpy.stack()函數(shù)將只有一個通道的灰度背景圖像轉(zhuǎn)換為三個通道的灰度圖像。這一步應(yīng)該做,因為OpenCV的add函數(shù)只有在要添加的圖像的形狀相同時才能工作。添加前景和背景以得到最終的圖像,只有紅色從灰度背景中突出。創(chuàng)建紅色彈出濾鏡的代碼是:#import the libraries
import cv2 as cv
import numpy as np
#read the image
img = cv.imread("D://medium_blogs//red_coat.jpg")
#convert the BGR image to HSV colour space
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
#obtain the grayscale image of the original image
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#set the bounds for the red hue
lower_red = np.a(chǎn)rray([160,100,50])
upper_red = np.a(chǎn)rray([180,255,255])
#create a mask using the bounds set
mask = cv.inRange(hsv, lower_red, upper_red)
#create an inverse of the mask
mask_inv = cv.bitwise_not(mask)
#Filter only the red colour from the original image using the mask(foreground)
res = cv.bitwise_and(img, img, mask=mask)
#Filter the regions containing colours other than red from the grayscale image(background)
background = cv.bitwise_and(gray, gray, mask = mask_inv)
#convert the one channelled grayscale background to a three channelled image
background = np.stack((background,)*3, axis=-1)
#add the foreground and the background
added_img = cv.a(chǎn)dd(res, background)
#create resizable windows for the images
cv.namedWindow("res", cv.WINDOW_NORMAL)
cv.namedWindow("hsv", cv.WINDOW_NORMAL)
cv.namedWindow("mask", cv.WINDOW_NORMAL)
cv.namedWindow("added", cv.WINDOW_NORMAL)
cv.namedWindow("back", cv.WINDOW_NORMAL)
cv.namedWindow("mask_inv", cv.WINDOW_NORMAL)
cv.namedWindow("gray", cv.WINDOW_NORMAL)
#display the images
cv.imshow("back", background)
cv.imshow("mask_inv", mask_inv)
cv.imshow("added",added_img)
cv.imshow("mask", mask)
cv.imshow("gray", gray)
cv.imshow("hsv", hsv)
cv.imshow("res", res)
if cv.waitKey(0):
   cv.destroyAllWindows()
現(xiàn)在讓我們看看結(jié)果:灰度圖像

HSV圖像

遮罩

遮罩逆

背景

前景

現(xiàn)在,是時候揭曉最期待的最終結(jié)果了!向你展示添加的最終圖像。

如你所見,我們得到了一些令人驚訝的結(jié)果。我們成功地將紅色從圖像中分離出來,將剩下的圖像變成了灰度,給我們帶來了這幅唯美的杰作。就這樣了,恭喜你,你已經(jīng)使用OpenCV創(chuàng)建了自己的彩色流行濾鏡!現(xiàn)在你可以讓自己感覺舒服,試著自己過濾除紅色以外的其他顏色。

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號