import cv2 as cv im_color = cv.imread("lena.png", cv.IMREAD_COLOR) im_gray = cv.cvtColor(im_color, cv.COLOR_BGR2GRAY)
At this point you have a color and a gray image. We are dealing with
uint8 images here. That means the images can have pixel values in the range of
[0, 255] and the values have to be integers.
Let’s do a binary thresholding operation. It creates a black and white masked image. The black regions have value
0 and the white regions
_, mask = cv.threshold(im_gray, thresh=180, maxval=255, type=cv.THRESH_BINARY) im_thresh_gray = cv.bitwise_and(im_gray, mask)
The binary mask can be seen below on the left. The image on it’s right is the result of applying
bitwise_and operation between the gray image and the mask. What happened is, the spatial locations where the mask had a pixel value zero (black), became pixel value zero in the result image. The locations where the mask had pixel value 255 (white), the resulting image retained it’s original gray value.
To apply this mask to our original color image, we need to convert the mask into a 3 channel image as the original color image is a 3 channel image.
mask3 = cv.cvtColor(mask, cv.COLOR_GRAY2BGR) # 3 channel mask
Then, we can apply this mask to our original color image using the same
im_thresh_color = cv.bitwise_and(im_color, mask3)
mask3 from the code is the image below on the left, and
im_thresh_color is on it’s right.
You can plot the results and see for yourself.
cv.imshow("original image", im_color) cv.imshow("binary mask", mask) cv.imshow("3 channel mask", mask3) cv.imshow("im_thresh_gray", im_thresh_gray) cv.imshow("im_thresh_color", im_thresh_color) cv.waitKey(0)
The original image is
lenacolor.png that I found here.