How does one convert a grayscale image to RGB in OpenCV (Python)? How does one convert a grayscale image to RGB in OpenCV (Python)? python python

How does one convert a grayscale image to RGB in OpenCV (Python)?


I am promoting my comment to an answer:

The easy way is:

You could draw in the original 'frame' itself instead of using gray image.

The hard way (method you were trying to implement):

backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) is the correct syntax.


Alternatively, cv2.merge() can be used to turn a single channel binary mask layer into a three channel color image by merging the same layer together as the blue, green, and red layers of the new image. We pass in a list of the three color channel layers - all the same in this case - and the function returns a single image with those color channels. This effectively transforms a grayscale image of shape (height, width, 1) into (height, width, 3)

To address your problem

I did some thresholding on an image and want to label the contours in green, but they aren't showing up in green because my image is in black and white.

This is because you're trying to display three channels on a single channel image. To fix this, you can simply merge the three single channels

image = cv2.imread('image.png')gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray_three = cv2.merge([gray,gray,gray])

Example

We create a color image with dimensions (200,200,3)

enter image description here

image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)

Next we convert it to grayscale and create another image using cv2.merge() with three gray channels

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray_three = cv2.merge([gray,gray,gray])

We now draw a filled contour onto the single channel grayscale image (left) with shape (200,200,1) and the three channel grayscale image with shape (200,200,3) (right). The left image showcases the problem you're experiencing since you're trying to display three channels on a single channel image. After merging the grayscale image into three channels, we can now apply color onto the image

enter image description hereenter image description here

contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])cv2.fillPoly(gray, [contour], [36,255,12])cv2.fillPoly(gray_three, [contour], [36,255,12])

Full code

import cv2import numpy as np# Create random color imageimage = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)# Convert to grayscale (1 channel)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# Merge channels to create color image (3 channels)gray_three = cv2.merge([gray,gray,gray])# Fill a contour on both the single channel and three channel imagecontour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])cv2.fillPoly(gray, [contour], [36,255,12])cv2.fillPoly(gray_three, [contour], [36,255,12])cv2.imshow('image', image)cv2.imshow('gray', gray)cv2.imshow('gray_three', gray_three)cv2.waitKey()


Try this:

import cv2import cvcolor_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)

I discovered, while using opencv, that some of the constants are defined in the cv2 module, and other in the cv module.