tft每日頭條

 > 生活

 > 如何快速學會摳圖

如何快速學會摳圖

生活 更新时间:2025-01-25 06:28:41

本文分享内容來自圖書《學習OpenCV 4:基于Python的算法實戰》,該書内容如下:

第1章 OpenCV快速入門; 第2章 圖像讀寫模塊imgcodecs; 第3章 核心庫模塊core; 第4章 圖像處理模塊imgproc(一); 第5章 圖像處理模塊imgproc(二); 第6章 可視化模塊highgui; 第7章 視頻處理模塊videoio; 第8章 視頻分析模塊video; 第9章 照片處理模塊photo; 第10章 2D特征模塊features2d; 第11章 相機标定與三維重建模塊calib3d; 第12章 傳統目标檢測模塊objdetect; 第13章 機器學習模塊ml; 第14章 深度神經網絡模塊dnn

歡迎關注圖書《深度學習計算機視覺實戰》與《學習OpenCV4:基于Python的算法實戰》。

Grabcuts是一種交互式前景提取算法,OpenCV允許讀者在待分割的圖像周圍提供矩形框,矩形框之外的部分屬于背景,此時不用指定前景。讀者也可以使用一個全局掩膜,将圖像的像素點分為确定前景、确定背景以及疑似前景和疑似背景,這樣确定區域将被算法用于将疑似區域進行分割。

OpenCV中提供了Grabcuts算法的函數grabCut,函數定義如下:

mask, bgdModel, fgdModel = grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)

參數說明如下:

u img,輸入圖像;

u mask,掩模(返回值);

u rect,包含分割對象的感興趣區域;

u bgdModel,背景模型的臨時數組(返回值);

u fgdModel,前景模型的臨時數組(返回值);

u iterCount,算法叠代次數;

u mode,處理模式,由GrabCutModes定義。

本案例實現了一個交互式的圖像分割,鼠标左鍵選取确定前景,鼠标右鍵選取确定背景,Grabcuts算法根據确定前景和确定背景進行圖像分割。

Grabcuts算法圖像分割案例代碼如下:

import cv2 import numpy as np #繪制前景/背景标識線标志 drawing = False # 定義GrabCut類,作用是設置一些參數 class GrabCut: def __init__(self, t_img): self.img = t_img self.img_raw = img.copy() self.img_width = img.shape[0] self.img_height = img.shape[1] self.img_show = self.img.copy() self.img_gc = self.img.copy() self.img_gc = cv2.GaussianBlur(self.img_gc, (3, 3), 0) self.lb_up = False self.rb_up = False self.lb_down = False self.rb_down = False self.mask = np.full(self.img.shape[:2], 2, dtype=np.uint8) self.firt_choose = True # 鼠标操作的的回調函數 def mouse_event(event, x, y, flags, param): global drawing, last_point, start_point # 左鍵按下,開始标識前景 if event == cv2.EVENT_LBUTTONDOWN: drawing = True # 設置鼠标按下的起始點 last_point = (x, y) start_point = last_point param.lb_down = True # 右鍵按下,開始标識背景 elif event == cv2.EVENT_RBUTTONDOWN: # 讀者請先标識前景,否則無法分割 if param.firt_choose: print("Please select foreground first!") return drawing = True last_point = (x, y) start_point = last_point param.rb_down = True # 鼠标移動,繪制标識前景和背景的線 elif event == cv2.EVENT_MOUSEMOVE: if drawing: # 鼠标左鍵按下的繪制 if param.lb_down: cv2.line(param.img_show, last_point, (x,y), (0, 0, 255), 2, -1) cv2.rectangle(param.mask, last_point, (x, y), 1, -1, 4) # 鼠标右鍵按下的繪制 if param.rb_down: cv2.line(param.img_show, last_point, (x, y), (255, 0, 0), 2, -1) cv2.rectangle(param.mask, last_point, (x, y), 0, -1, 4) last_point = (x, y) # 左鍵釋放,結束标識前景 elif event == cv2.EVENT_LBUTTONUP: drawing = False param.lb_up = True param.lb_down = False cv2.line(param.img_show, last_point, (x,y), (0, 0, 255), 2, -1) # 如果第一次标識,切換狀态 if param.firt_choose: param.firt_choose = False cv2.rectangle(param.mask, last_point, (x,y), 1, -1, 4) # 右鍵釋放,結束标識背景 elif event == cv2.EVENT_RBUTTONUP: # 如果首先标識背景則不做處理 if param.firt_choose: return drawing = False param.rb_up = True param.rb_down = False cv2.line(param.img_show, last_point, (x,y), (255, 0, 0), 2, -1) cv2.rectangle(param.mask, last_point, (x,y), 0, -1, 4) #執行操作 def process(img): if img is None: print('Can not read image correct!') return g_img = GrabCut(img) cv2.namedWindow('image') # 定義鼠标的回調函數 cv2.setMouseCallback('image', mouse_event, g_img) while (True): cv2.imshow('image', g_img.img_show) # 鼠标左鍵或者右鍵擡起時,按照标識執行Grabcut算法 if g_img.lb_up or g_img.rb_up: g_img.lb_up = False g_img.rb_up = False # 背景model bgdModel = np.zeros((1, 65), np.float64) # 前景model fgdModel = np.zeros((1, 65), np.float64) rect = (1, 1, g_img.img.shape[1], g_img.img.shape[0]) mask = g_img.mask g_img.img_gc = g_img.img.copy() #執行Grabcut算法 cv2.grabCut(g_img.img_gc, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK) # 0和2做背景 mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') # 使用蒙闆來獲取前景區域 g_img.img_gc = g_img.img_gc * mask2[:, :, np.newaxis] cv2.imshow('Grabcut_result', g_img.img_gc) # 按下ESC鍵退出 if cv2.waitKey(20) == 27: break if __name__ == '__main__': img = cv2.imread("./src.jpg") process(img)

如圖5.30為第一次選取前景的操作。

如何快速學會摳圖(簡簡單單就能摳圖)1

圖5.30

如圖5.31為分割後的結果,圖中人物被有效的摳取出來了。

如何快速學會摳圖(簡簡單單就能摳圖)2

圖5.31

繼續使用右鍵選取背景區域,如圖5.32所示。

如何快速學會摳圖(簡簡單單就能摳圖)3

圖5.32

摳取人像的結果如圖5.33所示。

如何快速學會摳圖(簡簡單單就能摳圖)4

圖5.33

如果分割效果不佳,讀者可以繼續選取前景或者背景,多次叠代進行更加精細化的分割。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved