Masking BGR Image Using 2D Mask

I have a 3D array (image) with a shape (480, 640, 3)

. Here 3 refers to the color code BGR

. I would like to put a mask on this image using data from the red image array. Depending on its value, some masks must be masked.

The mask creation works great. It behaves exactly as expected. To apply a mask to the original image, I first apply a mask to the cyan and green image. Everything is still good. Now I am adding three masked arrays that return an array with a shape (480, 640, 3)

. However, building this array using imshow

results in the original image. No mask sign.

Below I put my code. The code works for any image size / shape. All you have to do is change the name "Whatever_image_you_like.png"

to the name of any image on your computer.

import numpy
import numpy.ma
import scipy.misc
import matplotlib.pyplot as plt

pixel_value = 130   #Value in range 0 to 255

image = scipy.misc.imread("Whatever_image_you_like.png")

#Extract Blue, Green, and Red image from original image
image_B = numpy.copy(image[:, :, 0])
image_G = numpy.copy(image[:, :, 1])
image_R = numpy.copy(image[:, :, 2])

#Define mask depending on pixel value in Red image
image_mask = numpy.empty([image.shape[0], image.shape[1]], dtype = bool)
image_mask[image_R < pixel_value] = False

#Apply mask to Blue, Green, and Red images
B_masked = numpy.ma.masked_array(image_B, mask = ~image_mask)
G_masked = numpy.ma.masked_array(image_G, mask = ~image_mask)
R_masked = numpy.ma.masked_array(image_R, mask = ~image_mask)

#Stack masked images together again
masked_image = numpy.ma.dstack((B_masked, G_masked, R_masked))

#Plot original image and masked version
fig = plt.figure()

ax1 = fig.add_subplot(2, 1, 1)
ax1.imshow(image)

ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(masked_image)

plt.show()

      

What am I doing wrong? Is there a better way to approach this problem?

+3


source to share


2 answers


Try using a mask with the same shape as image

(it will actually be a 3D mask). Once created, image_mask

do

# create mask with same dimensions as image
mask = numpy.zeros_like(image)

# copy your image_mask to all dimensions (i.e. colors) of your image
for i in range(3): 
    mask[:,:,i] = image_mask.copy()

# apply the mask to your image
masked_image = image[mask]

      



This way I avoid masked arrays in numpy.

+1


source


Perhaps this alternative approach would be easier in cases like this:



image[image_mask,:] = np.nan

      

0


source







All Articles