ahmed osama
ahmed osama

Reputation: 295

remove foreground from segmented image

i have trained a model to provide the segment in image and the output image looks like that enter image description here

the original image is like that enter image description here

i have tried opencv to subtract the two images by

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



image3 = cv2.absdiff(image1,image2)

but the output is not what i need , i would like to have cristiano and white background , how i can achieve that

Upvotes: 2

Views: 3734

Answers (2)

user1767754
user1767754

Reputation: 25154

Explanation: As your files have already the right shape (BGR) and (A) it is very easy to accomplish what you are trying to do, here are the steps.

1) Load original image as BGR (In opencv it's reversed rgb)

2) Load "mask" image as a single Channel A

3) Merge the original images BGR channel and consume your mask image as A Alpha

Code:

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)

Output:

enter image description here

Upvotes: 4

Kinght 金
Kinght 金

Reputation: 18341

After read the segment image, convert to grayscale, then threshold it to get fg-mask and bg-mask. Then use cv2.bitwise_and to "crop" the fg or bg as you want.

#!/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

Upvotes: 3

Related Questions