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