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

前端 未结 4 1863
忘掉有多难
忘掉有多难 2020-12-08 06:15

I\'m learning image processing using OpenCV for a realtime application. I did some thresholding on an image and want to label the contours in green, but they aren\'t showing

相关标签:
4条回答
  • 2020-12-08 06:30

    One you convert your image to gray-scale you cannot got back. You have gone from three channel to one, when you try to go back all three numbers will be the same. So the short answer is no you cannot go back. The reason your backtorgb function this throwing that error is because it needs to be in the format:

    CvtColor(input, output, CV_GRAY2BGR)
    

    OpenCV use BGR not RGB, so if you fix the ordering it should work, though your image will still be gray.

    0 讨论(0)
  • 2020-12-08 06:33

    Try this:

    import cv2
    import cv
    
    color_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.

    0 讨论(0)
  • 2020-12-08 06:50

    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.

    0 讨论(0)
  • 2020-12-08 06:51

    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)

    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

    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 cv2
    import numpy as np
    
    # Create random color image
    image = (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 image
    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])
    
    cv2.imshow('image', image)
    cv2.imshow('gray', gray)
    cv2.imshow('gray_three', gray_three)
    cv2.waitKey()
    
    0 讨论(0)
提交回复
热议问题