python opencv3 grabcut前景檢測


git:https://github.com/linyi0604/Computer-Vision

 1 import numpy as np  2 import cv2  3 import matplotlib.pyplot as plt  4 
 5 # 讀入圖片
 6 img = cv2.imread("../data/mm2.jpeg")  7 # 創建一個和加載圖像一樣形狀的 填充為0的掩膜
 8 mask = np.zeros(img.shape[:2], np.uint8)  9 
10 # 創建以0填充的前景和背景模型
11 bgdModel = np.zeros((1, 65), np.float64) 12 fgdModel = np.zeros((1, 65), np.float64) 13 
14 # 定義一個矩形
15 rect = (100, 50, 421, 378) 16 
17 cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) 18 
19 """
20 cv2.grabCut() 21 參數: 22  img: 輸入圖像 23  mask: 蒙板圖像,確定前景區域,背景區域,不確定區域, 24  可以設置為cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD, 25  也可以輸入0,1,2,3 26  rect: 包含前景的矩形 格式(x, y, w, h) 27  bdgModel: 算法內部使用的數組. 你只需要創建兩個大小為 (1,65),數據類型為 np.float64 的數組 28  fgdModel: 算法內部使用的數組. 你只需要創建兩個大小為 (1,65),數據類型為 np.float64 的數組 29  iterCount: 算法的迭代次數 30  mode: 可以設置為 cv2.GC_INIT_WITH_RECT 或 cv2.GC_INIT_WITH_MASK,也可以聯合使用。 31  這是用來確定我們進行修改的方式,矩形模式或者掩模模式 32 
33 算法會修改掩模圖像,在新的掩模圖像中, 34 所有的像素被分為四類:背景,前景,可能是背景/前景使用 4 個不同的標簽標記。 35 然后我們來修改掩模圖像, 36 所有的 0 像素和 1 像素都被歸為 0(例如背景),所有的 1 像素和 3 像素都被歸為 1(前景)。 37 我們最終的掩模圖像就這樣准備好了。用它和輸入圖像相乘就得到了分割好的圖像 38 
39 原理: 40  1 輸入矩形框,矩形框外部區域都是背景。內部一定包含前景。 41  2 電腦對輸入圖像進行初始化,標記前景和背景的像素。 42  3 使用高斯混合模型(GMM)對前景和背景建模。 43  4 根據輸入,GMM會學習並創建新的像素分布。 44  對未知的像素(前景或背景不確定),根據他們與已知的分類像素關系進行分類。(類似聚類操作) 45  5 這樣會根據像素的分布創建一幅圖,圖中節點是像素。 46  除了像素點是節點以外,還有Source_node和Sink_node兩個節點。 47  所有的前景圖像都與Source_node相連。背景與Sink_node相連。 48  6 像素是否連接到Source_node/end_node依賴於權值, 49  這個權值由像素屬於同一類,也就是前景或者背景的概率來決定。 50  如果像素的顏色有很大區別,那么他們之間的權重就很小。 51  7 使用mincut算法對圖像進行分割。 52  它會根據最小代價方程對圖像分成source_node和sink_node。 53  代價方程是指裁剪所有邊上權重的和。 54  裁剪完成后,所有連接到source_node的判定為前景,sink_node上的為背景。 55 繼續此過程,直到分類收斂。 56 
57     
58 
59 """
60 mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype("uint8") 61 img = img*mask2[:, :, np.newaxis] 62 
63 plt.subplot(121), plt.imshow(img) 64 plt.title("grabcut"), plt.xticks([]), plt.yticks([]) 65 plt.subplot(122), plt.imshow(cv2.cvtColor(cv2.imread("../data/mm2.jpeg"), cv2.COLOR_BGR2RGB)) 66 plt.title("original"), plt.xticks([]), plt.yticks([]) 67 plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM