【课题总结】OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的課題報告—OpenCV 摳圖項目實戰(5)自適應閾值摳圖
本系列是 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)源程序代碼
第三章 閾值摳圖
閾值處理方法直觀簡單,是一種基本的圖像分割方法。
根據圖像的整體或部分信息適當選擇閾值,像素值高于閾值時設為1/255,低于閾值時設為0,以此將圖像中感興趣的區域篩選出來生成掩模,再與原圖像合成即可得到摳圖圖像。
由于待處理圖像的灰度級數與其灰度直方圖是不確定的,對于不同的圖像、不同的目標前景,需要選取適當的閾值處理方法進行圖像分割。本章采用固定閾值、自適應閾值與色彩范圍三種方法進行圖像摳圖處理。
3.2 自適應閾值摳圖
在圖像摳圖的應用中,噪聲和非均勻光照等因素會影響閾值算法的性能。對于很多圖像,使用固定閾值難以獲得理解的摳圖效果,就需要使用自適應閾值處理方法,使用可變閾值處理。
自適應閾值處理可以根據圖像不同區域的亮度分布,使用高斯濾波、移動平均等方法計算其局部閾值,以此得到摳圖圖像。
OpenCV 提供了函數 cv.adaptivethreshold()實現圖像的閾值處理。
函數說明:
cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst參數說明:
- scr:輸入圖像,8位單通道圖像
- dst:輸出圖像,大小和類型與輸入圖像相同
- maxValue:二值處理的最大值設置,通常為255
- adaptiveMethod:自適應閾值算法
- cv.ADAPTIVE_THRESH_MEAN_C:閾值為矩形鄰域像素值的均值
- cv.ADAPTIVE_THRESH_GAUSSIAN_C:閾值為矩形鄰域像素值的加權均值,默認權值服從高斯分布
- thresholdType:閾值類型,可選項THRESH_BINARY或THRESH_BINARY_INV
- blockSize:自適應計算的鄰域大小,如:3, 5, 7等
- C:偏移量
使用自適應閾值進行圖像摳圖的基本程序如下:
# MattingAdaptThresh.py # Copyright 2021 youcans, XUPT # Crated:2021-12-10import cv2 import numpy as np from matplotlib import pyplot as plt# 1. 讀取原始圖像 imgOri = cv2.imread("../images/lady983Green.jpg") # 讀取原始圖像 height, width, channels = imgOri.shape# 2. 從原始圖像提取綠色通道 imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY) # 彩色圖像轉換為灰度圖像 imgGreen = imgOri[:, :, 1] # imgGreen 為 綠色通道的 色彩強度圖 (注意不是原圖的灰度轉換結果) print(imgOri.shape, imgGray.shape, imgGreen.shape)# 3. 綠色通道轉換為二值圖像,生成遮罩 Mask、逆遮罩 MaskInv # colorThresh = 245 # 綠屏背景的顏色閾值 (注意研究閾值的影響) # ret, binary = cv2.threshold(imgGreen, colorThresh, 255, cv2.THRESH_BINARY) # 轉換為二值圖像,生成遮罩,摳圖區域黑色遮蓋# 自適應閾值化能夠根據圖像不同區域亮度分布自適應地改變閾值 # cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst # 參數 adaptiveMethod: ADAPTIVE_THRESH_MEAN_C(均值法), ADAPTIVE_THRESH_GAUSSIAN_C(高斯法) # 參數 thresholdType: THRESH_BINARY(小于閾值為0), THRESH_BINARY_INV(大于閾值為0) # 參數 blockSize: 鄰域大小,正奇數 # 參數 C: 偏移量,一般取 0 binary = cv2.adaptiveThreshold(imgGreen, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 0) binaryInv = cv2.bitwise_not(binary) # 按位非(黑白轉置),生成逆遮罩,摳圖區域白色開窗,摳圖以外區域黑色# 4. 用遮罩進行摳圖和更換背景 # 生成摳圖圖像 (前景保留,背景黑色) imgMatte = cv2.bitwise_and(imgOri, imgOri, mask=binaryInv) # 生成摳圖前景,標準摳圖以外的逆遮罩區域輸出黑色 # 將背景顏色更換為紅色: 修改逆遮罩 (摳圖以外區域黑色) imgReplace = imgOri.copy() imgReplace[binaryInv == 0] = [0, 0, 255] # 黑色區域(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(binary, cmap='gray'), plt.title("binary mask"), plt.axis('off') plt.subplot(235), plt.imshow(binaryInv, cmap='gray'), plt.title("inv-binary mask"), 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.4所示。
對于確定顏色背景的藍屏摳圖,自適應閾值方法的結果并沒有更好,但是仍然能很好地提取圖像特征,如果使用其它方法進一步進行處理,也可以得到滿意的摳圖效果。
而對于自然背景圖像摳圖,自適應閾值方法的性能優于固定閾值方法。
圖3.4 自適應閾值摳圖法
【本節完】
版權聲明:
歡迎關注『Python 小白的項目實戰 @ youcans』 原創作品
原創作品,轉載必須標注原文鏈接:https://blog.csdn.net/youcans/article/details/122296231
Copyright 2022 youcans, XUPT
Crated:2022-01-01
歡迎關注『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 抠图项目实战(5)自适应阈值抠图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辩论计算机未来不能取代书本的问题,电脑不
- 下一篇: 【youcans 的 OpenCV 例程