从分段图像中删除前景

时间:2017-11-26 00:23:48

标签: python opencv

我已经训练了一个模型来提供图像中的片段,输出图像看起来像enter image description here

原始图片就像enter image description here

我试过opencv来减去两个图像

image1 = imread("cristiano-ronaldo.jpg")
image2 = imread("cristiano-ronaldo_seg.png")



image3 = cv2.absdiff(image1,image2)

但输出不是我需要的,我想有cristiano和白色背景,我怎么能实现那个

2 个答案:

答案 0 :(得分:4)

<强>说明: 由于您的文件已经具有正确的形状(BGR)(A),因此很容易实现您要执行的操作,以下是步骤。

1)将原始图像加载为 BGR (在opencv中将其反转为rgb)

2)将“mask”图像加载为单个Channel A

3)合并原始图片BGR频道并将您的蒙版图片用作A Alpha

<强>代码:

import numpy as np
import cv2

# Load an color image in grayscale
img1 = cv2.imread('ronaldo.png',3) #READ BGR

img2 = cv2.imread('ronaldoMask.png',0) #READ AS ALPHA
kernel = np.ones((2,2), np.uint8) #Create Kernel for the depth
img2 = cv2.erode(img2, kernel, iterations=2) #Erode using Kernel

width, height, depth = img1.shape
combinedImage = cv2.merge((img1, img2))



cv2.imwrite('ronaldocombine.png',combinedImage)

<强>输出:

enter image description here

答案 1 :(得分:2)

读取分段图像后,转换为灰度,然后将其阈值设置为fg-maskbg-mask。然后使用cv2.bitwise_and根据需要“裁剪”fg或bg。

#!/usr/bin/python3
# 2017.11.26 09:56:40 CST
# 2017.11.26 10:11:40 CST
import cv2
import numpy as np

## read 
img = cv2.imread("img.jpg")
seg = cv2.imread("seg.png")

## create fg/bg mask 
seg_gray = cv2.cvtColor(seg, cv2.COLOR_BGR2GRAY)
_,fg_mask = cv2.threshold(seg_gray, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
_,bg_mask = cv2.threshold(seg_gray, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

## convert mask to 3-channels
fg_mask = cv2.cvtColor(fg_mask, cv2.COLOR_GRAY2BGR)
bg_mask = cv2.cvtColor(bg_mask, cv2.COLOR_GRAY2BGR)

## cv2.bitwise_and to extract the region
fg = cv2.bitwise_and(img, fg_mask)
bg = cv2.bitwise_and(img, bg_mask)

## save 
cv2.imwrite("fg.png", fg)
cv2.imwrite("bg.png", bg)

enter image description here