Search code examples
pythonopencvmaskimage-segmentationmasking

Error in cropping the image using binary mask


I would like to crop my original image using the binary mask for which I have written code

import cv2
import numpy as np
import matplotlib as plt

img = cv2.imread("image.png")
mask = cv2.imread("mask.png")
h, w, _ = img.shape
mask = cv2.resize(cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY), (w, h)) # Resize image
bg = np.zeros_like(img, 'uint8') # Black background
def crop(img, bg, mask):
 fg = cv2.bitwise_or(img, img, mask=mask) 
 fg_back_inv = cv2.bitwise_or(bg, bg, mask=cv2.bitwise_not(mask))
 New_image = cv2.bitwise_or(fg, fg_back_inv)
 return New_image

plt.imshow(cv2.cvtColor(New_image, cv2.COLOR_BGR2RGB))

I am getting an error which states

NameError: name 'New_image' is not defined

Kindly suggest me where i am making a mistake here


Solution

  • You have only created the function crop, but you haven't called it. You will have to create the variable and assign the value you get from the function, and only then use it for the plot.

    def crop(img, bg, mask):
     fg = cv2.bitwise_or(img, img, mask=mask) 
     fg_back_inv = cv2.bitwise_or(bg, bg, mask=cv2.bitwise_not(mask))
     New_image = cv2.bitwise_or(fg, fg_back_inv)
     return New_image
    New_image = crop(img, bg, mask)
    plt.imshow(cv2.cvtColor(New_image, cv2.COLOR_BGR2RGB))