【课题总结】OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(6)色彩范圍摳圖
本系列是 Python 小白的課題作業(yè)《基于OpenCV 的圖像分割和摳圖》。
需要說明的是,本系列并不能算是 OpenCV 的摳圖項(xiàng)目教程,只是以此為主題的課題報(bào)告。其中包括了一個(gè)較為完整的 PyQt 項(xiàng)目。
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(1)目錄摘要
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(2)摳圖緒論
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(3)摳圖綜述
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(7)邊緣檢測
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(8)圖像輪廓
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(9)評價(jià)指標(biāo)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(10)PyQt5 使用
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(11)算法實(shí)驗(yàn)平臺(tái)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(12)源程序代碼
第三章 閾值摳圖
3.3 色彩范圍摳圖
通常,即使對于確定顏色背景的藍(lán)屏摳圖,背景圖像的所有像素的顏色也并非完全相同,而是處于相近的色彩范圍內(nèi)。因此,對背景色彩范圍進(jìn)行閾值處理,比閾值處理更為合理。
3.3.1 HSV顏色空間的基本概念
RGB 通道不能很好地反映出物體具體的顏色信息,而 HSV 空間可以非常直觀的表達(dá)色彩的明暗、色調(diào)及鮮艷程度。例如,紅色在 HSV 空間中 H 維度的范圍為 0~10 和 160~180,而在 RGB 中很難簡單明確地給出紅色范圍的表達(dá)式。因此,通常使用 HSV 色彩空間進(jìn)行某種顏色的識(shí)別和不同顏色的對比。
HSV 分別指色相(Hue)、飽和度(Saturation)、明度(Value),又稱 HSB(B 指 Brightness)。
- 色相是色彩的基本屬性,就是顏色的名稱,如紅色、黃色等。
- 飽和度(S)是指色彩的純度,飽和度越高色彩越純,飽和度低則逐漸變灰,取值 0-100%。
- 明度(V),取值為 0~max(計(jì)算機(jī)存儲(chǔ)長度)。
HSV 顏色空間可以用一個(gè)圓錐空間模型來描述。圓錐的頂點(diǎn)處 V=0,H 和 S 無定義,代表黑色;圓錐的頂面中心處V=max,S=0,H 無定義,代表白色。
當(dāng) S=1, V=1 時(shí),H 所代表的任何顏色被稱為純色;當(dāng) S=0 時(shí),飽和度為 0,顏色最淺,最淺被描述為灰色,灰色的亮度由 V 決定,此時(shí) H 無意義;當(dāng) V=0 時(shí),顏色最暗,最暗被描述為黑色,此時(shí) H 和 S 均無意義,無論如何取值均為黑色。
圖3.5 HSV顏色空間
HSV 是一種將 RGB 色彩空間中的點(diǎn)在倒圓錐體中的表示方法,HSV 可以與 RGB 相互轉(zhuǎn)化。
HSV 模型是針對用戶觀感的一種顏色模型,側(cè)重于色彩表示,什么顏色、深淺如何、明暗如何。
HSV 模型在對指定顏色分割時(shí)非常有效。用 H 和 S 分量表示顏色距離,顏色距離指代表兩種顏色之間的數(shù)值差異。對于不同的彩色區(qū)域,混合 H 與 S 變量,劃定閾值,即可進(jìn)行簡單的分割。
OpenCV 提供了函數(shù) cv.cvtColor()實(shí)現(xiàn)圖像的顏色空間轉(zhuǎn)換。
函數(shù)說明:
cv. cvtColor(src, code[, dst[, dstCn]]) → dst函數(shù)cvtColor()將圖像從一種顏色空間轉(zhuǎn)換為另一種顏色空間。
參數(shù)說明:
- src:輸入圖像
- dst:輸出圖像
- code:色彩空間轉(zhuǎn)換代碼
- cv2.COLOR_BGR2RGB:BGR -> RGB
- cv2.COLOR_RGB2BGR:RGB -> BGR
- cv2.COLOR_BGR2GRAY:BGR -> Gray
- cv2.COLOR_GRAY2BGR:Gray -> BGR
- cv2.COLOR_BGR2HSV:BGR -> HSV
- cv2.COLOR_HSV2BGR:HSV -> BGR
3.3.2 劃分顏色區(qū)域
函數(shù)inRange()可以實(shí)現(xiàn)按顏色區(qū)域[lowerb,upperb]對圖像進(jìn)行二值分割。
函數(shù)inRange()檢查數(shù)組元素是否在設(shè)定區(qū)間內(nèi),通常用于在HSV空間檢查設(shè)定的顏色區(qū)域范圍。如果圖像的某個(gè)像素值在 [lowerb,upperb] 之間,則輸出圖像的相應(yīng)位置置 255;否則置0。
因此,cv.inrange 函數(shù)可以實(shí)現(xiàn)按顏色區(qū)域 [lowerb,upperb] 對圖像進(jìn)行二值分割。對于單通道圖像,如果灰度圖像的某個(gè)像素的灰度值在指定的高低閾值范圍內(nèi),則輸出圖像中該像素值為255,否則為 0。
對于兩通道或多通道圖像,如果原始圖像的某個(gè)像素的各個(gè)通道的像素值都在指定的閾值范圍內(nèi),則輸出圖像中該像素值為255,否則為 0。
函數(shù)說明:
cv.inRange(src, lowerb, upperb[, dst]) → dst參數(shù)說明:
- src:輸入圖像,可以是灰度圖像,也可以是多通道的彩色圖像
- lowerb:標(biāo)量(src為單通道)或數(shù)組(src為多通道),下邊界閾值
- upperb:標(biāo)量(src為單通道)或數(shù)組(src為多通道),上邊界閾值
- dst:輸出圖像,單通道的二值圖像,大小與 src 相同,深度為 CV_8U
注意事項(xiàng):
使用色彩范圍進(jìn)行圖像分割的基本程序如下:
# MattingRangeThresh.py # Copyright 2021 youcans, XUPTy # Crated:2021-12-10# 1. 讀取原始圖像 imgOri = cv2.imread("../images/lady983Green.jpg") # 讀取原始圖像 height, width, channels = imgOri.shape# 2. 從原始圖像提取綠色通道 imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY) # 彩色圖像轉(zhuǎn)換為灰度圖像 imgGreen = imgOri[:,:,1] print(imgOri.shape, imgGray.shape, imgGreen.shape)# 3. 轉(zhuǎn)換到 HSV 空間,對背景顏色范圍進(jìn)行閾值處理,生成遮罩 Mask、逆遮罩 MaskInv # 使用 cv.nrange 函數(shù)在 HSV 空間檢查設(shè)定的顏色區(qū)域范圍,轉(zhuǎn)換為二值圖像,生成遮罩 # cv.inRange(src, lowerb, upperb[, dst] ) -> dst # inRange(frame,Scalar(low_b,low_g,low_r), Scalar(high_b,high_g,high_r))hsv = cv2.cvtColor(imgOri, cv2.COLOR_BGR2HSV) # 將圖片轉(zhuǎn)換到 HSV 色彩空間 lowerColor = np.array([35, 43, 46]) # (下限: 綠色33/43/46,紅色156/43/46,藍(lán)色100/43/46)upperColor = np.array([77, 255, 255]) # (上限: 綠色77/255/255,紅色180/255/255,藍(lán)色124/255/255)binary = cv2.inRange(hsv, lowerColor, upperColor) binaryInv = cv2.bitwise_not(binary)# 4. 用遮罩進(jìn)行摳圖和更換背景 # 生成摳圖圖像 (前景保留,背景黑色)imgMatte = cv2.bitwise_and(imgOri, imgOri, mask=binaryInv) # 生成摳圖前景,標(biāo)準(zhǔn)摳圖以外的逆遮罩區(qū)域輸出黑色imgReplace = imgOri.copy() imgReplace[binaryInv==0] = [0,0,255]plt.figure(figsize=(12,8))plt.subplot(231), plt.imshow(cv2.cvtColor(imgOri, cv2.COLOR_BGR2RGB)), plt.title("Origin image"), plt.axis('off')plt.subplot(232), plt.imshow(imgGray, cmap='gray'), plt.title("Gray image"), plt.axis('off')plt.subplot(233), plt.imshow(imgGreen, cmap='gray'), plt.title("Green channel level"), plt.axis('off')# plt.subplot(234), plt.imshow(binary, cmap='gray'), plt.title("binary mask"), plt.axis('off')plt.subplot(234), plt.imshow(binaryInv, cmap='gray'), plt.title("inv-binary mask"), plt.axis('off')plt.subplot(235), plt.imshow(cv2.cvtColor(imgMatte, cv2.COLOR_BGR2RGB)), plt.title("Matting Image"), plt.axis('off')plt.subplot(236), plt.imshow(cv2.cvtColor(imgReplace, cv2.COLOR_BGR2RGB)), plt.title("BgColor changed"), plt.axis('off')plt.tight_layout()使用自適應(yīng)閾值方法對單色背景圖像摳圖的結(jié)果如圖3.6所示。
對于確定顏色背景的藍(lán)屏摳圖,基于色彩范圍的閾值摳圖取得了非常滿意的效果,對人像的頭發(fā)絲都可以進(jìn)行很好的分割,其性能優(yōu)于固定閾值和自適應(yīng)閾值方法。
圖3.6 色彩范圍摳圖法
【本節(jié)完】
版權(quán)聲明:
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:https://blog.csdn.net/youcans/article/details/122296231
Copyright 2022 youcans, XUPT
Crated:2022-01-05
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(1)目錄摘要
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(2)摳圖緒論
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(3)摳圖綜述
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(7)邊緣檢測
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(8)圖像輪廓
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(9)評價(jià)指標(biāo)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(10)PyQt5 使用
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(11)算法實(shí)驗(yàn)平臺(tái)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(12)源程序代碼
總結(jié)
以上是生活随笔為你收集整理的【课题总结】OpenCV 抠图项目实战(6)色彩范围抠图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV 例程200篇】21. 图
- 下一篇: Python小白的数学建模课-04.整数