簡體   English   中英

如何從圖像中刪除背景(減法)?

[英]How to remove background from an image (subtraction)?

我有以下幾點:

  • 項目就位之前的圖像(只是背景),如下所示:

背景圖片

  • 帶有項目的圖像,如下所示:

帶有項目的圖像

在這種情況下,我想要一個只有鏡頭蓋的圖像。 我怎樣才能減去這兩個圖像? 我認為 OpenCV 很適合這個問題,但我在減去這些圖像時遇到了問題。

我在本教程中發現了類似的東西: https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.ZFC35FDC70D5FC69D269883A822C7A53E之前,/之后他們正在談論

鏈接的教程(幾乎)完成了這項工作,你有一個兩幀的“視頻”,所以只需將這兩幀輸入到所述背景減法器:看看會發生什么:

import cv2
from skimage import io  # Only needed for web grabbing images, use cv2.imread for local images

# Read images from web
img_bg = cv2.cvtColor(io.imread('https://i.stack.imgur.com/rMoqy.jpg'), cv2.COLOR_RGB2BGR)
img = cv2.cvtColor(io.imread('https://i.stack.imgur.com/oyrKo.jpg'), cv2.COLOR_RGB2BGR)

# Set up and feed background subtractor (cf. tutorial linked in question)
backSub = cv2.createBackgroundSubtractorMOG2()
_ = backSub.apply(img_bg)
mask = backSub.apply(img)

# Morphological opening and closing to improve mask
mask_morph = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (21, 21)))
mask_morph = cv2.morphologyEx(mask_morph, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (21, 21)))

# Generate output
output = cv2.bitwise_and(img, img, None, mask_morph)

# Visualization
cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('mask_morph', mask_morph)
cv2.imshow('output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

背景減法器生成的mask如下所示:

面具

所以,我們需要一些形態學的開閉來改進掩碼,參見cv2.morphologyEx 然后,修改后的mask_morph如下所示:

修改過的面具

使用cv2.bitwise_and和掩碼,我們得到所需的output

輸出

請注意,帽子下方的較寬邊緣主要來自陰影,如教程中所述。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM