如何利用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)。我知道這聽起來很難以理解,但讓我給你解釋一下!按碳ぁ边@個詞在這里的意思是當我們看到一個物體時到達我們眼睛的光,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。值這是一種顏色亮度的量度。當亮度值最大時,顏色變?yōu)榘咨斄炼戎底钚r,顏色變?yōu)楹谏_@通常是0到100%,但在OpenCV中,值的范圍是從0到255,F(xiàn)在讓我們采取一些實際行動。過濾顏色為了使用OpenCV過濾顏色,我們必須指定顏色的色調(diào)范圍,我們需要過濾,并為顏色創(chuàng)建一個遮罩。然后利用遮罩對原始圖像陣列(本文將詳細討論)進行按位與運算,得到濾波后的顏色結(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ù)獲取原始圖像的灰度格式。現(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)在你可以讓自己感覺舒服,試著自己過濾除紅色以外的其他顏色。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-10.29立即報名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會
-
10月31日立即下載>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月14日立即報名>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
推薦專題
- 1 Intel宣布40年來最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國產(chǎn)AI芯片公司破產(chǎn)!白菜價拍賣
- 5 具身智能火了,但規(guī)模落地還需時間
- 6 國產(chǎn)英偉達們,抓緊沖刺A股
- 7 三次錯失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來
- 9 英偉達的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實力拉滿
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市