NumPy convert 8-bit to 16/32-bit image

17,096

Thanks to @moarningsun, problem resolved:

i = cv2.imread(imgNameIn, cv2.CV_LOAD_IMAGE_COLOR) # Need to be sure to have a 8-bit input
img = np.array(i, dtype=np.uint16) # This line only change the type, not values
img *= 256 # Now we get the good values in 16 bit format
Share:
17,096
Admin
Author by

Admin

Updated on August 06, 2022

Comments

  • Admin
    Admin over 1 year

    I am using OpenCV 2 to do some images manipulations in YCbCr color space. For the moment I can detect some noise due to the conversion RGB -> YCbCr and then YCbCr -> RGB, but as said in the documentation:

    If you use cvtColor with 8-bit images, the conversion will have some information lost. For many applications, this will not be noticeable but it is recommended to use 32-bit images in applications that need the full range of colors or that convert an image before an operation and then convert back.

    So I would like to convert my image in 16 or 32 bits, but I didn't found how to do it with NumPy. Some ideas?

    img = cv2.imread(imgNameIn)
    # Here I want to convert img in 32 bits
    cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB, img)
    # Some image processing ...
    cv2.cvtColor(img, cv2.COLOR_YCR_CB2BGR, img)
    cv2.imwrite(imgNameOut, img, [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 0])
    
  • Dan Mašek
    Dan Mašek over 6 years
    "result f a multiplication ... returns in general a float` -- Could you, please, provide some demonstrations of this happening?
  • Eskapp
    Eskapp over 6 years
    @DanMašek I meant "in general" in the mathematical sense of the term - At least once. I re-wrote what I had in mind in a clearer way. Thank you for pointing out that my answer was confusing.
  • skull3r7
    skull3r7 over 3 years
    you can also use cv2.normalize(img, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX) to get the right 16bit values