【课题总结】OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(4)固定閾值摳圖
本系列是 Python 小白的課題作業(yè)《基于OpenCV 的圖像分割和摳圖》。
需要說明的是,本系列并不能算是 OpenCV 的摳圖項目教程,只是以此為主題的課題報告。其中包括了一個較為完整的 PyQt 項目。
歡迎關(guān)注『Python 小白的項目實戰(zhàn) @ youcans』 原創(chuàng)作品
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(1)目錄摘要
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(2)摳圖緒論
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(3)摳圖綜述
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(7)邊緣檢測
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(8)圖像輪廓
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(9)評價指標(biāo)
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(10)PyQt5 使用
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(11)算法實驗平臺
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(12)源程序代碼
第三章 閾值摳圖
閾值處理方法直觀簡單,是一種基本的圖像分割方法。
根據(jù)圖像的整體或部分信息適當(dāng)選擇閾值,像素值高于閾值時設(shè)為1/255,低于閾值時設(shè)為0,以此將圖像中感興趣的區(qū)域篩選出來生成掩模,再與原圖像合成即可得到摳圖圖像。
由于待處理圖像的灰度級數(shù)與其灰度直方圖是不確定的,對于不同的圖像、不同的目標(biāo)前景,需要選取適當(dāng)?shù)拈撝堤幚矸椒ㄟM(jìn)行圖像分割。本章采用固定閾值、自適應(yīng)閾值與色彩范圍三種方法進(jìn)行圖像摳圖處理。
3.1 固定閾值摳圖
藍(lán)屏摳圖問題泛指已知背景顏色的單一背景顏色圖像摳圖,廣泛應(yīng)用于證件拍照、影視制作。由于背景顏色是確定已知的,可以使用固定閾值方法進(jìn)行圖像摳圖和背景顏色更換。
固定閾值摳圖方法先將彩色圖像轉(zhuǎn)化為灰度圖像,再基于適當(dāng)?shù)念伾撝祵D像進(jìn)行閾值處理生成二值化掩模遮罩圖像。將掩模遮罩與原始圖像合成就得到摳圖圖像,將掩模遮罩與新的背景圖片合成就可以更換圖像背景。
固定閾值處理方法的閾值,可由人工經(jīng)驗選擇或基于圖像直方圖進(jìn)行選擇。對于藍(lán)屏摳圖問題,通常使用固定閾值處理方法就可以獲得較好的結(jié)果。
OpenCV 提供了函數(shù) cv.threshold()實現(xiàn)圖像的閾值處理。
函數(shù)說明:
cv.threshold(src, thresh, maxval, type[, dst]) → ret, dst函數(shù) threshold() 將灰度圖像轉(zhuǎn)換為二值圖像(Binarization),即圖像完全由像素 0 和 255 構(gòu)成,呈現(xiàn)出只有黑白兩色的視覺效果,突出圖片的輪廓。
該方法通過固定閾值 thresh 處理圖像,也稱固定閾值處理方法。
參數(shù)說明:
- scr:進(jìn)行閾值處理的灰度圖像
- thresh:閾值,取值范圍 0~255
- maxval:填充色,取值范圍 0~255,一般取 255
- type:閾值類型
- cv2.THRESH_BINARY:小于閾值的像素置 0,大于閾值的像素置 maxval;
- cv2.THRESH_BINARY_INV:小于閾值的像素置 maxval,大于閾值的像素置 0;
- cv2.THRESH_TRUNC:小于閾值的像素不變(保持原值),大于閾值的像素置閾值thresh;
- cv2.THRESH_TOZERO:小于閾值的像素置 0,大于閾值時不變(保持原值)
- cv2.THRESH_TOZERO_INV:大于閾值的像素置 0,小于閾值時不變(保持原值)
- cv2.THRESH_OTSU:使用 OTSU 算法選擇閾值
- dst:返回二值化的灰度圖像
- ret:返回二值化的閾值
使用固定閾值進(jìn)行圖像摳圖的基本程序如下:
# MattingThresh.py # Copyright 2021 youcans, XUPTy # Crated:2021-12-10 # 1. 讀取原始圖像 imgOri = cv2.imread("../images/lady983Green.jpg") # 讀取原始圖像 width, height, channels = imgOri.shape# 2. 從原始圖像提取綠色通道 imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY) # 彩色圖像轉(zhuǎn)換為灰度圖像 imgGreen = imgOri[:,:,1] # imgGreen 為 綠色通道的 色彩強(qiáng)度圖 (注意不是原圖的灰度轉(zhuǎn)換結(jié)果) print(imgOri.shape, imgGray.shape, imgGreen.shape)# 3. 綠色通道轉(zhuǎn)換為二值圖像,生成遮罩 Mask、逆遮罩 MaskInv # 如果背景不是綠屏而是其它顏色,可以采用對應(yīng)的顏色通道進(jìn)行閾值處理 (不宜基于灰度圖像進(jìn)行固定閾值處理,性能差異很大) colorThresh = 220 # 綠屏背景的顏色閾值 (注意研究閾值的影響) ret, binary = cv2.threshold(imgGreen, colorThresh, 255, cv2.THRESH_BINARY) # 轉(zhuǎn)換為二值圖像,生成遮罩,摳圖區(qū)域黑色遮蓋 binaryInv = cv2.bitwise_not(binary) # 按位非(黑白轉(zhuǎn)置),生成逆遮罩,摳圖區(qū)域白色開窗,摳圖以外區(qū)域黑色# 4. 用遮罩進(jìn)行摳圖和更換背景 # 生成摳圖圖像 (前景保留,背景黑色) imgMatte = cv2.bitwise_and(imgOri, imgOri, mask=binaryInv) # 生成摳圖前景,標(biāo)準(zhǔn)摳圖以外的逆遮罩區(qū)域輸出黑色# 將背景顏色更換為紅色: 修改逆遮罩 (摳圖以外區(qū)域黑色) imgReplace = imgOri.copy() imgReplace[binaryInv==0] = [0,0,255] # 黑色區(qū)域(0/0/0)修改為紅色(BGR: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(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() plt.show()使用固定閾值方法對單色背景圖像摳圖的結(jié)果如圖3.1~圖3.3所示。
圖中:inv-binary mask為生成的掩膜圖像,Matting Image為生成的目標(biāo)前景圖像,BgColor changed為合成的摳圖圖像。
需要說明的是,圖中的結(jié)果并不是將原始圖像轉(zhuǎn)換為灰度圖像進(jìn)行閾值處理,而是提取原始圖像的綠色通道(imaGreen)處理的結(jié)果。由于原始圖像的背景就是綠色,使用圖像綠色通道進(jìn)行閾值處理,其性能比灰度圖像得到了顯著提高。
(1)使用固定閾值方法對單色背景圖像摳圖,可以取得比較滿意的結(jié)果;
(2)閾值設(shè)置對藍(lán)屏摳圖的性能影響較大,圖3.1~圖3.3分別是閾值設(shè)置為220、230、245時的實驗結(jié)果。
由以上三組圖片對比可以看到,閾值較大時的掩膜圖像較為精確完整,而閾值降低后的掩膜圖像質(zhì)量降低。
固定閾值方法對于藍(lán)色/綠色/紅色背景的圖像摳圖的性能較好,但對于自然背景圖像處理比較困難。
圖3.1 固定閾值摳圖法(閾值=245)
圖3.2 固定閾值摳圖法(閾值=230)
圖3.3 固定閾值摳圖法(閾值=220)
【本節(jié)完】
版權(quán)聲明:
歡迎關(guān)注『Python 小白的項目實戰(zhàn) @ youcans』 原創(chuàng)作品
原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:https://blog.csdn.net/youcans/article/details/122306621
Copyright 2022 youcans, XUPT
Crated:2022-01-05
歡迎關(guān)注『Python 小白從零開始 PyQt5 項目實戰(zhàn) @ Youcans』系列,持續(xù)更新中
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(1)目錄摘要
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(2)摳圖緒論
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(3)摳圖綜述
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(7)邊緣檢測
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(8)圖像輪廓
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(9)評價指標(biāo)
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(10)PyQt5 使用
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(11)算法實驗平臺
Python 小白的課題報告—OpenCV 摳圖項目實戰(zhàn)(12)源程序代碼
總結(jié)
以上是生活随笔為你收集整理的【课题总结】OpenCV 抠图项目实战(4)固定阈值抠图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么样递增的注册成对的点云
- 下一篇: 服务器bios修改uefi,服务器 ue