how to convert an RGB image to numpy array?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







65















I have an RGB image. I want to convert it to numpy array. I did the following



im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)


It creates an array with no shape. I assume it is a iplimage object.










share|improve this question




















  • 2





    If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

    – Paul
    Oct 14 '11 at 4:50


















65















I have an RGB image. I want to convert it to numpy array. I did the following



im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)


It creates an array with no shape. I assume it is a iplimage object.










share|improve this question




















  • 2





    If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

    – Paul
    Oct 14 '11 at 4:50














65












65








65


20






I have an RGB image. I want to convert it to numpy array. I did the following



im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)


It creates an array with no shape. I assume it is a iplimage object.










share|improve this question
















I have an RGB image. I want to convert it to numpy array. I did the following



im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)


It creates an array with no shape. I assume it is a iplimage object.







python image opencv numpy






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 '18 at 19:34









Francisco Couzo

6,37032333




6,37032333










asked Oct 14 '11 at 4:13









ShanShan

5,5892675114




5,5892675114








  • 2





    If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

    – Paul
    Oct 14 '11 at 4:50














  • 2





    If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

    – Paul
    Oct 14 '11 at 4:50








2




2





If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

– Paul
Oct 14 '11 at 4:50





If cv is the OpenCV module, then you should tag it as such. This link may help: opencv.willowgarage.com/documentation/python/…

– Paul
Oct 14 '11 at 4:50












9 Answers
9






active

oldest

votes


















90














You can use newer OpenCV python interface (if I'm not mistaken it is available since OpenCV 2.2). It natively uses numpy arrays:



import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)


result:



<type 'numpy.ndarray'>





share|improve this answer





















  • 1





    cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

    – Neon22
    Apr 3 '12 at 7:16






  • 46





    Beware that cv2.imread() returns a numpy array in BGR not RGB.

    – pnd
    Jan 25 '17 at 20:55






  • 1





    Will it work with jpg, png and gif images?

    – user4846835
    Nov 12 '17 at 19:47






  • 2





    @pnd your comment is sacred!

    – Eduardo Pignatelli
    May 10 '18 at 14:25






  • 1





    Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

    – Xitcod13
    Jun 22 '18 at 0:52





















46














PIL (Python Imaging Library) and Numpy work well together.



I use the following functions.



from PIL import Image
import numpy as np

def load_image( infilename ) :
img = Image.open( infilename )
img.load()
data = np.asarray( img, dtype="int32" )
return data

def save_image( npdata, outfilename ) :
img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
img.save( outfilename )


The 'Image.fromarray' is a little ugly because I clip incoming data to [0,255], convert to bytes, then create a grayscale image. I mostly work in gray.



An RGB image would be something like:



 outimg = Image.fromarray( ycc_uint8, "RGB" )
outimg.save( "ycc.tif" )





share|improve this answer





















  • 1





    This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

    – ely
    May 5 '17 at 15:40













  • The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

    – David Poole
    May 15 '17 at 13:06











  • Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

    – progyammer
    Apr 15 '18 at 4:06



















27














You can also use matplotlib for this.



from matplotlib.image import imread

img = imread('abc.tiff')
print(type(img))


output:
<class 'numpy.ndarray'>






share|improve this answer





















  • 1





    This is very simple. I like it :)

    – jeongmin.cha
    Nov 25 '17 at 11:30











  • and returns RGB if I am not wrong

    – Mrinal
    Jan 19 at 13:20











  • @Mrinal Yes, it does.

    – Rishabh Agrahari
    Jan 20 at 5:11



















6














You need to use cv.LoadImageM instead of cv.LoadImage:



In [1]: import cv
In [2]: import numpy as np
In [3]: x = cv.LoadImageM('im.tif')
In [4]: im = np.asarray(x)
In [5]: im.shape
Out[5]: (487, 650, 3)





share|improve this answer
























  • Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

    – Shan
    Oct 14 '11 at 5:04













  • I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

    – Justin Peel
    Oct 14 '11 at 5:12



















6














Late answer, but I've come to prefer the imageio module to the other alternatives



import imageio
im = imageio.imread('abc.tiff')


Similar to cv2.imread(), it produces a numpy array by default, but in RGB form.






share|improve this answer































    2














    def opencv_image_as_array(im):
    """Interface image from OpenCV's native format to a numpy array.

    note: this is a slicing trick, and modifying the output array will also change
    the OpenCV image data. if you want a copy, use .copy() method on the array!
    """
    import numpy as np
    w, h, n = im.width, im.height, im.channels
    modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
    if n not in modes:
    raise StandardError('unsupported number of channels: {0}'.format(n))
    out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
    return out





    share|improve this answer































      1














      When using the answer from David Poole I get a SystemError with gray scale PNGs and maybe other files. My solution is:



      import numpy as np
      from PIL import Image

      img = Image.open( filename )
      try:
      data = np.asarray( img, dtype='uint8' )
      except SystemError:
      data = np.asarray( img.getdata(), dtype='uint8' )


      Actually img.getdata() would work for all files, but it's slower, so I use it only when the other method fails.






      share|improve this answer
























      • This does not work at all

        – mskw
        Jul 22 '17 at 4:03



















      1














      As of today, your best bet is to use:



      img = cv2.imread(image_path)   # reads an image in the BGR format
      img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB


      You'll see img will be a numpy array of type:



      <class 'numpy.ndarray'>





      share|improve this answer































        0














        I also adopted imageio, but I found the following machinery useful for pre- and post-processing:



        import imageio
        import numpy as np

        def imload(*a, **k):
        i = imageio.imread(*a, **k)
        i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
        i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
        return i/255


        def imsave(i, url, *a, **k):
        # Original order of arguments was counterintuitive. It should
        # read verbally "Save the image to the URL" — not "Save to the
        # URL the image."

        i = np.flip(i, 1)
        i = i.transpose((1, 0, 2))
        i *= 255

        i = i.round()
        i = np.maximum(i, 0)
        i = np.minimum(i, 255)

        i = np.asarray(i, dtype=np.uint8)

        imageio.imwrite(url, i, *a, **k)


        The rationale is that I am using numpy for image processing, not just image displaying. For this purpose, uint8s are awkward, so I convert to floating point values ranging from 0 to 1.



        When saving images, I noticed I had to cut the out-of-range values myself, or else I ended up with a really gray output. (The gray output was the result of imageio compressing the full range, which was outside of [0, 256), to values that were inside the range.)



        There were a couple other oddities, too, which I mentioned in the comments.






        share|improve this answer


























          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f7762948%2fhow-to-convert-an-rgb-image-to-numpy-array%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          9 Answers
          9






          active

          oldest

          votes








          9 Answers
          9






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          90














          You can use newer OpenCV python interface (if I'm not mistaken it is available since OpenCV 2.2). It natively uses numpy arrays:



          import cv2
          im = cv2.imread("abc.tiff",mode='RGB')
          print type(im)


          result:



          <type 'numpy.ndarray'>





          share|improve this answer





















          • 1





            cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

            – Neon22
            Apr 3 '12 at 7:16






          • 46





            Beware that cv2.imread() returns a numpy array in BGR not RGB.

            – pnd
            Jan 25 '17 at 20:55






          • 1





            Will it work with jpg, png and gif images?

            – user4846835
            Nov 12 '17 at 19:47






          • 2





            @pnd your comment is sacred!

            – Eduardo Pignatelli
            May 10 '18 at 14:25






          • 1





            Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

            – Xitcod13
            Jun 22 '18 at 0:52


















          90














          You can use newer OpenCV python interface (if I'm not mistaken it is available since OpenCV 2.2). It natively uses numpy arrays:



          import cv2
          im = cv2.imread("abc.tiff",mode='RGB')
          print type(im)


          result:



          <type 'numpy.ndarray'>





          share|improve this answer





















          • 1





            cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

            – Neon22
            Apr 3 '12 at 7:16






          • 46





            Beware that cv2.imread() returns a numpy array in BGR not RGB.

            – pnd
            Jan 25 '17 at 20:55






          • 1





            Will it work with jpg, png and gif images?

            – user4846835
            Nov 12 '17 at 19:47






          • 2





            @pnd your comment is sacred!

            – Eduardo Pignatelli
            May 10 '18 at 14:25






          • 1





            Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

            – Xitcod13
            Jun 22 '18 at 0:52
















          90












          90








          90







          You can use newer OpenCV python interface (if I'm not mistaken it is available since OpenCV 2.2). It natively uses numpy arrays:



          import cv2
          im = cv2.imread("abc.tiff",mode='RGB')
          print type(im)


          result:



          <type 'numpy.ndarray'>





          share|improve this answer















          You can use newer OpenCV python interface (if I'm not mistaken it is available since OpenCV 2.2). It natively uses numpy arrays:



          import cv2
          im = cv2.imread("abc.tiff",mode='RGB')
          print type(im)


          result:



          <type 'numpy.ndarray'>






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Sep 16 '18 at 9:18









          awiebe

          1,86211322




          1,86211322










          answered Oct 15 '11 at 8:02









          Andrey KamaevAndrey Kamaev

          24.9k57678




          24.9k57678








          • 1





            cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

            – Neon22
            Apr 3 '12 at 7:16






          • 46





            Beware that cv2.imread() returns a numpy array in BGR not RGB.

            – pnd
            Jan 25 '17 at 20:55






          • 1





            Will it work with jpg, png and gif images?

            – user4846835
            Nov 12 '17 at 19:47






          • 2





            @pnd your comment is sacred!

            – Eduardo Pignatelli
            May 10 '18 at 14:25






          • 1





            Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

            – Xitcod13
            Jun 22 '18 at 0:52
















          • 1





            cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

            – Neon22
            Apr 3 '12 at 7:16






          • 46





            Beware that cv2.imread() returns a numpy array in BGR not RGB.

            – pnd
            Jan 25 '17 at 20:55






          • 1





            Will it work with jpg, png and gif images?

            – user4846835
            Nov 12 '17 at 19:47






          • 2





            @pnd your comment is sacred!

            – Eduardo Pignatelli
            May 10 '18 at 14:25






          • 1





            Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

            – Xitcod13
            Jun 22 '18 at 0:52










          1




          1





          cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

          – Neon22
          Apr 3 '12 at 7:16





          cv2 is the new interface and is a lot easier to use IMHO. It is designed to more closely represent the c++ classes.

          – Neon22
          Apr 3 '12 at 7:16




          46




          46





          Beware that cv2.imread() returns a numpy array in BGR not RGB.

          – pnd
          Jan 25 '17 at 20:55





          Beware that cv2.imread() returns a numpy array in BGR not RGB.

          – pnd
          Jan 25 '17 at 20:55




          1




          1





          Will it work with jpg, png and gif images?

          – user4846835
          Nov 12 '17 at 19:47





          Will it work with jpg, png and gif images?

          – user4846835
          Nov 12 '17 at 19:47




          2




          2





          @pnd your comment is sacred!

          – Eduardo Pignatelli
          May 10 '18 at 14:25





          @pnd your comment is sacred!

          – Eduardo Pignatelli
          May 10 '18 at 14:25




          1




          1





          Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

          – Xitcod13
          Jun 22 '18 at 0:52







          Getting: No module named 'cv2'. I tried pip3 install cv2 but it doesnt seem to work. while imageio installed no problem.

          – Xitcod13
          Jun 22 '18 at 0:52















          46














          PIL (Python Imaging Library) and Numpy work well together.



          I use the following functions.



          from PIL import Image
          import numpy as np

          def load_image( infilename ) :
          img = Image.open( infilename )
          img.load()
          data = np.asarray( img, dtype="int32" )
          return data

          def save_image( npdata, outfilename ) :
          img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
          img.save( outfilename )


          The 'Image.fromarray' is a little ugly because I clip incoming data to [0,255], convert to bytes, then create a grayscale image. I mostly work in gray.



          An RGB image would be something like:



           outimg = Image.fromarray( ycc_uint8, "RGB" )
          outimg.save( "ycc.tif" )





          share|improve this answer





















          • 1





            This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

            – ely
            May 5 '17 at 15:40













          • The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

            – David Poole
            May 15 '17 at 13:06











          • Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

            – progyammer
            Apr 15 '18 at 4:06
















          46














          PIL (Python Imaging Library) and Numpy work well together.



          I use the following functions.



          from PIL import Image
          import numpy as np

          def load_image( infilename ) :
          img = Image.open( infilename )
          img.load()
          data = np.asarray( img, dtype="int32" )
          return data

          def save_image( npdata, outfilename ) :
          img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
          img.save( outfilename )


          The 'Image.fromarray' is a little ugly because I clip incoming data to [0,255], convert to bytes, then create a grayscale image. I mostly work in gray.



          An RGB image would be something like:



           outimg = Image.fromarray( ycc_uint8, "RGB" )
          outimg.save( "ycc.tif" )





          share|improve this answer





















          • 1





            This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

            – ely
            May 5 '17 at 15:40













          • The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

            – David Poole
            May 15 '17 at 13:06











          • Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

            – progyammer
            Apr 15 '18 at 4:06














          46












          46








          46







          PIL (Python Imaging Library) and Numpy work well together.



          I use the following functions.



          from PIL import Image
          import numpy as np

          def load_image( infilename ) :
          img = Image.open( infilename )
          img.load()
          data = np.asarray( img, dtype="int32" )
          return data

          def save_image( npdata, outfilename ) :
          img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
          img.save( outfilename )


          The 'Image.fromarray' is a little ugly because I clip incoming data to [0,255], convert to bytes, then create a grayscale image. I mostly work in gray.



          An RGB image would be something like:



           outimg = Image.fromarray( ycc_uint8, "RGB" )
          outimg.save( "ycc.tif" )





          share|improve this answer















          PIL (Python Imaging Library) and Numpy work well together.



          I use the following functions.



          from PIL import Image
          import numpy as np

          def load_image( infilename ) :
          img = Image.open( infilename )
          img.load()
          data = np.asarray( img, dtype="int32" )
          return data

          def save_image( npdata, outfilename ) :
          img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
          img.save( outfilename )


          The 'Image.fromarray' is a little ugly because I clip incoming data to [0,255], convert to bytes, then create a grayscale image. I mostly work in gray.



          An RGB image would be something like:



           outimg = Image.fromarray( ycc_uint8, "RGB" )
          outimg.save( "ycc.tif" )






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Feb 26 '18 at 16:52









          Community

          11




          11










          answered Oct 14 '11 at 14:51









          David PooleDavid Poole

          1,86642529




          1,86642529








          • 1





            This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

            – ely
            May 5 '17 at 15:40













          • The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

            – David Poole
            May 15 '17 at 13:06











          • Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

            – progyammer
            Apr 15 '18 at 4:06














          • 1





            This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

            – ely
            May 5 '17 at 15:40













          • The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

            – David Poole
            May 15 '17 at 13:06











          • Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

            – progyammer
            Apr 15 '18 at 4:06








          1




          1





          This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

          – ely
          May 5 '17 at 15:40







          This fails with an error, TypeError: long() argument must be a string or a number, not 'PixelAccess' and looking at the documentation for PIL's PixelAccess class, it does not appear to offer methods that would enable np.array to convert its underlying data into an ndarray format. You need to omit the use of img.load() and deal only with the result of Image.open(...).

          – ely
          May 5 '17 at 15:40















          The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

          – David Poole
          May 15 '17 at 13:06





          The img.load() works around a weird caching issue in PIL. The data wouldn't be loaded until explicitly needed. The example still works for me with the exception of changing "import Image" to "from PIL import Image" when working with Pillow (the PIL fork).

          – David Poole
          May 15 '17 at 13:06













          Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

          – progyammer
          Apr 15 '18 at 4:06





          Upvote for using PIL only and not OpenCV. I'm not against OpenCV though.

          – progyammer
          Apr 15 '18 at 4:06











          27














          You can also use matplotlib for this.



          from matplotlib.image import imread

          img = imread('abc.tiff')
          print(type(img))


          output:
          <class 'numpy.ndarray'>






          share|improve this answer





















          • 1





            This is very simple. I like it :)

            – jeongmin.cha
            Nov 25 '17 at 11:30











          • and returns RGB if I am not wrong

            – Mrinal
            Jan 19 at 13:20











          • @Mrinal Yes, it does.

            – Rishabh Agrahari
            Jan 20 at 5:11
















          27














          You can also use matplotlib for this.



          from matplotlib.image import imread

          img = imread('abc.tiff')
          print(type(img))


          output:
          <class 'numpy.ndarray'>






          share|improve this answer





















          • 1





            This is very simple. I like it :)

            – jeongmin.cha
            Nov 25 '17 at 11:30











          • and returns RGB if I am not wrong

            – Mrinal
            Jan 19 at 13:20











          • @Mrinal Yes, it does.

            – Rishabh Agrahari
            Jan 20 at 5:11














          27












          27








          27







          You can also use matplotlib for this.



          from matplotlib.image import imread

          img = imread('abc.tiff')
          print(type(img))


          output:
          <class 'numpy.ndarray'>






          share|improve this answer















          You can also use matplotlib for this.



          from matplotlib.image import imread

          img = imread('abc.tiff')
          print(type(img))


          output:
          <class 'numpy.ndarray'>







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Oct 30 '18 at 5:54

























          answered Oct 6 '17 at 11:30









          Rishabh AgrahariRishabh Agrahari

          1,13211118




          1,13211118








          • 1





            This is very simple. I like it :)

            – jeongmin.cha
            Nov 25 '17 at 11:30











          • and returns RGB if I am not wrong

            – Mrinal
            Jan 19 at 13:20











          • @Mrinal Yes, it does.

            – Rishabh Agrahari
            Jan 20 at 5:11














          • 1





            This is very simple. I like it :)

            – jeongmin.cha
            Nov 25 '17 at 11:30











          • and returns RGB if I am not wrong

            – Mrinal
            Jan 19 at 13:20











          • @Mrinal Yes, it does.

            – Rishabh Agrahari
            Jan 20 at 5:11








          1




          1





          This is very simple. I like it :)

          – jeongmin.cha
          Nov 25 '17 at 11:30





          This is very simple. I like it :)

          – jeongmin.cha
          Nov 25 '17 at 11:30













          and returns RGB if I am not wrong

          – Mrinal
          Jan 19 at 13:20





          and returns RGB if I am not wrong

          – Mrinal
          Jan 19 at 13:20













          @Mrinal Yes, it does.

          – Rishabh Agrahari
          Jan 20 at 5:11





          @Mrinal Yes, it does.

          – Rishabh Agrahari
          Jan 20 at 5:11











          6














          You need to use cv.LoadImageM instead of cv.LoadImage:



          In [1]: import cv
          In [2]: import numpy as np
          In [3]: x = cv.LoadImageM('im.tif')
          In [4]: im = np.asarray(x)
          In [5]: im.shape
          Out[5]: (487, 650, 3)





          share|improve this answer
























          • Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

            – Shan
            Oct 14 '11 at 5:04













          • I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

            – Justin Peel
            Oct 14 '11 at 5:12
















          6














          You need to use cv.LoadImageM instead of cv.LoadImage:



          In [1]: import cv
          In [2]: import numpy as np
          In [3]: x = cv.LoadImageM('im.tif')
          In [4]: im = np.asarray(x)
          In [5]: im.shape
          Out[5]: (487, 650, 3)





          share|improve this answer
























          • Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

            – Shan
            Oct 14 '11 at 5:04













          • I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

            – Justin Peel
            Oct 14 '11 at 5:12














          6












          6








          6







          You need to use cv.LoadImageM instead of cv.LoadImage:



          In [1]: import cv
          In [2]: import numpy as np
          In [3]: x = cv.LoadImageM('im.tif')
          In [4]: im = np.asarray(x)
          In [5]: im.shape
          Out[5]: (487, 650, 3)





          share|improve this answer













          You need to use cv.LoadImageM instead of cv.LoadImage:



          In [1]: import cv
          In [2]: import numpy as np
          In [3]: x = cv.LoadImageM('im.tif')
          In [4]: im = np.asarray(x)
          In [5]: im.shape
          Out[5]: (487, 650, 3)






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Oct 14 '11 at 4:57









          Justin PeelJustin Peel

          41.4k54872




          41.4k54872













          • Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

            – Shan
            Oct 14 '11 at 5:04













          • I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

            – Justin Peel
            Oct 14 '11 at 5:12



















          • Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

            – Shan
            Oct 14 '11 at 5:04













          • I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

            – Justin Peel
            Oct 14 '11 at 5:12

















          Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

          – Shan
          Oct 14 '11 at 5:04







          Thanks a lot... Could you please also help me in finding out that if I create an image using 'cv.CreateImage(width,height,channels)'... How could it be converted to numpy array?

          – Shan
          Oct 14 '11 at 5:04















          I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

          – Justin Peel
          Oct 14 '11 at 5:12





          I think that you need to use cv.CreateMat instead or use cv.CreateMat and copy from the image to the mat using cv.CvtColor or some similar thing. Take a look at the link that Paul posted to above.

          – Justin Peel
          Oct 14 '11 at 5:12











          6














          Late answer, but I've come to prefer the imageio module to the other alternatives



          import imageio
          im = imageio.imread('abc.tiff')


          Similar to cv2.imread(), it produces a numpy array by default, but in RGB form.






          share|improve this answer




























            6














            Late answer, but I've come to prefer the imageio module to the other alternatives



            import imageio
            im = imageio.imread('abc.tiff')


            Similar to cv2.imread(), it produces a numpy array by default, but in RGB form.






            share|improve this answer


























              6












              6








              6







              Late answer, but I've come to prefer the imageio module to the other alternatives



              import imageio
              im = imageio.imread('abc.tiff')


              Similar to cv2.imread(), it produces a numpy array by default, but in RGB form.






              share|improve this answer













              Late answer, but I've come to prefer the imageio module to the other alternatives



              import imageio
              im = imageio.imread('abc.tiff')


              Similar to cv2.imread(), it produces a numpy array by default, but in RGB form.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Apr 24 '18 at 20:28









              slizbslizb

              1,91321821




              1,91321821























                  2














                  def opencv_image_as_array(im):
                  """Interface image from OpenCV's native format to a numpy array.

                  note: this is a slicing trick, and modifying the output array will also change
                  the OpenCV image data. if you want a copy, use .copy() method on the array!
                  """
                  import numpy as np
                  w, h, n = im.width, im.height, im.channels
                  modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
                  if n not in modes:
                  raise StandardError('unsupported number of channels: {0}'.format(n))
                  out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
                  return out





                  share|improve this answer




























                    2














                    def opencv_image_as_array(im):
                    """Interface image from OpenCV's native format to a numpy array.

                    note: this is a slicing trick, and modifying the output array will also change
                    the OpenCV image data. if you want a copy, use .copy() method on the array!
                    """
                    import numpy as np
                    w, h, n = im.width, im.height, im.channels
                    modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
                    if n not in modes:
                    raise StandardError('unsupported number of channels: {0}'.format(n))
                    out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
                    return out





                    share|improve this answer


























                      2












                      2








                      2







                      def opencv_image_as_array(im):
                      """Interface image from OpenCV's native format to a numpy array.

                      note: this is a slicing trick, and modifying the output array will also change
                      the OpenCV image data. if you want a copy, use .copy() method on the array!
                      """
                      import numpy as np
                      w, h, n = im.width, im.height, im.channels
                      modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
                      if n not in modes:
                      raise StandardError('unsupported number of channels: {0}'.format(n))
                      out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
                      return out





                      share|improve this answer













                      def opencv_image_as_array(im):
                      """Interface image from OpenCV's native format to a numpy array.

                      note: this is a slicing trick, and modifying the output array will also change
                      the OpenCV image data. if you want a copy, use .copy() method on the array!
                      """
                      import numpy as np
                      w, h, n = im.width, im.height, im.channels
                      modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
                      if n not in modes:
                      raise StandardError('unsupported number of channels: {0}'.format(n))
                      out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
                      return out






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Oct 14 '11 at 5:08









                      wimwim

                      167k54318451




                      167k54318451























                          1














                          When using the answer from David Poole I get a SystemError with gray scale PNGs and maybe other files. My solution is:



                          import numpy as np
                          from PIL import Image

                          img = Image.open( filename )
                          try:
                          data = np.asarray( img, dtype='uint8' )
                          except SystemError:
                          data = np.asarray( img.getdata(), dtype='uint8' )


                          Actually img.getdata() would work for all files, but it's slower, so I use it only when the other method fails.






                          share|improve this answer
























                          • This does not work at all

                            – mskw
                            Jul 22 '17 at 4:03
















                          1














                          When using the answer from David Poole I get a SystemError with gray scale PNGs and maybe other files. My solution is:



                          import numpy as np
                          from PIL import Image

                          img = Image.open( filename )
                          try:
                          data = np.asarray( img, dtype='uint8' )
                          except SystemError:
                          data = np.asarray( img.getdata(), dtype='uint8' )


                          Actually img.getdata() would work for all files, but it's slower, so I use it only when the other method fails.






                          share|improve this answer
























                          • This does not work at all

                            – mskw
                            Jul 22 '17 at 4:03














                          1












                          1








                          1







                          When using the answer from David Poole I get a SystemError with gray scale PNGs and maybe other files. My solution is:



                          import numpy as np
                          from PIL import Image

                          img = Image.open( filename )
                          try:
                          data = np.asarray( img, dtype='uint8' )
                          except SystemError:
                          data = np.asarray( img.getdata(), dtype='uint8' )


                          Actually img.getdata() would work for all files, but it's slower, so I use it only when the other method fails.






                          share|improve this answer













                          When using the answer from David Poole I get a SystemError with gray scale PNGs and maybe other files. My solution is:



                          import numpy as np
                          from PIL import Image

                          img = Image.open( filename )
                          try:
                          data = np.asarray( img, dtype='uint8' )
                          except SystemError:
                          data = np.asarray( img.getdata(), dtype='uint8' )


                          Actually img.getdata() would work for all files, but it's slower, so I use it only when the other method fails.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 28 '16 at 19:58









                          daigndaign

                          424213




                          424213













                          • This does not work at all

                            – mskw
                            Jul 22 '17 at 4:03



















                          • This does not work at all

                            – mskw
                            Jul 22 '17 at 4:03

















                          This does not work at all

                          – mskw
                          Jul 22 '17 at 4:03





                          This does not work at all

                          – mskw
                          Jul 22 '17 at 4:03











                          1














                          As of today, your best bet is to use:



                          img = cv2.imread(image_path)   # reads an image in the BGR format
                          img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB


                          You'll see img will be a numpy array of type:



                          <class 'numpy.ndarray'>





                          share|improve this answer




























                            1














                            As of today, your best bet is to use:



                            img = cv2.imread(image_path)   # reads an image in the BGR format
                            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB


                            You'll see img will be a numpy array of type:



                            <class 'numpy.ndarray'>





                            share|improve this answer


























                              1












                              1








                              1







                              As of today, your best bet is to use:



                              img = cv2.imread(image_path)   # reads an image in the BGR format
                              img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB


                              You'll see img will be a numpy array of type:



                              <class 'numpy.ndarray'>





                              share|improve this answer













                              As of today, your best bet is to use:



                              img = cv2.imread(image_path)   # reads an image in the BGR format
                              img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB


                              You'll see img will be a numpy array of type:



                              <class 'numpy.ndarray'>






                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Mar 9 at 21:02









                              belvederefbelvederef

                              10726




                              10726























                                  0














                                  I also adopted imageio, but I found the following machinery useful for pre- and post-processing:



                                  import imageio
                                  import numpy as np

                                  def imload(*a, **k):
                                  i = imageio.imread(*a, **k)
                                  i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
                                  i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
                                  return i/255


                                  def imsave(i, url, *a, **k):
                                  # Original order of arguments was counterintuitive. It should
                                  # read verbally "Save the image to the URL" — not "Save to the
                                  # URL the image."

                                  i = np.flip(i, 1)
                                  i = i.transpose((1, 0, 2))
                                  i *= 255

                                  i = i.round()
                                  i = np.maximum(i, 0)
                                  i = np.minimum(i, 255)

                                  i = np.asarray(i, dtype=np.uint8)

                                  imageio.imwrite(url, i, *a, **k)


                                  The rationale is that I am using numpy for image processing, not just image displaying. For this purpose, uint8s are awkward, so I convert to floating point values ranging from 0 to 1.



                                  When saving images, I noticed I had to cut the out-of-range values myself, or else I ended up with a really gray output. (The gray output was the result of imageio compressing the full range, which was outside of [0, 256), to values that were inside the range.)



                                  There were a couple other oddities, too, which I mentioned in the comments.






                                  share|improve this answer






























                                    0














                                    I also adopted imageio, but I found the following machinery useful for pre- and post-processing:



                                    import imageio
                                    import numpy as np

                                    def imload(*a, **k):
                                    i = imageio.imread(*a, **k)
                                    i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
                                    i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
                                    return i/255


                                    def imsave(i, url, *a, **k):
                                    # Original order of arguments was counterintuitive. It should
                                    # read verbally "Save the image to the URL" — not "Save to the
                                    # URL the image."

                                    i = np.flip(i, 1)
                                    i = i.transpose((1, 0, 2))
                                    i *= 255

                                    i = i.round()
                                    i = np.maximum(i, 0)
                                    i = np.minimum(i, 255)

                                    i = np.asarray(i, dtype=np.uint8)

                                    imageio.imwrite(url, i, *a, **k)


                                    The rationale is that I am using numpy for image processing, not just image displaying. For this purpose, uint8s are awkward, so I convert to floating point values ranging from 0 to 1.



                                    When saving images, I noticed I had to cut the out-of-range values myself, or else I ended up with a really gray output. (The gray output was the result of imageio compressing the full range, which was outside of [0, 256), to values that were inside the range.)



                                    There were a couple other oddities, too, which I mentioned in the comments.






                                    share|improve this answer




























                                      0












                                      0








                                      0







                                      I also adopted imageio, but I found the following machinery useful for pre- and post-processing:



                                      import imageio
                                      import numpy as np

                                      def imload(*a, **k):
                                      i = imageio.imread(*a, **k)
                                      i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
                                      i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
                                      return i/255


                                      def imsave(i, url, *a, **k):
                                      # Original order of arguments was counterintuitive. It should
                                      # read verbally "Save the image to the URL" — not "Save to the
                                      # URL the image."

                                      i = np.flip(i, 1)
                                      i = i.transpose((1, 0, 2))
                                      i *= 255

                                      i = i.round()
                                      i = np.maximum(i, 0)
                                      i = np.minimum(i, 255)

                                      i = np.asarray(i, dtype=np.uint8)

                                      imageio.imwrite(url, i, *a, **k)


                                      The rationale is that I am using numpy for image processing, not just image displaying. For this purpose, uint8s are awkward, so I convert to floating point values ranging from 0 to 1.



                                      When saving images, I noticed I had to cut the out-of-range values myself, or else I ended up with a really gray output. (The gray output was the result of imageio compressing the full range, which was outside of [0, 256), to values that were inside the range.)



                                      There were a couple other oddities, too, which I mentioned in the comments.






                                      share|improve this answer















                                      I also adopted imageio, but I found the following machinery useful for pre- and post-processing:



                                      import imageio
                                      import numpy as np

                                      def imload(*a, **k):
                                      i = imageio.imread(*a, **k)
                                      i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
                                      i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
                                      return i/255


                                      def imsave(i, url, *a, **k):
                                      # Original order of arguments was counterintuitive. It should
                                      # read verbally "Save the image to the URL" — not "Save to the
                                      # URL the image."

                                      i = np.flip(i, 1)
                                      i = i.transpose((1, 0, 2))
                                      i *= 255

                                      i = i.round()
                                      i = np.maximum(i, 0)
                                      i = np.minimum(i, 255)

                                      i = np.asarray(i, dtype=np.uint8)

                                      imageio.imwrite(url, i, *a, **k)


                                      The rationale is that I am using numpy for image processing, not just image displaying. For this purpose, uint8s are awkward, so I convert to floating point values ranging from 0 to 1.



                                      When saving images, I noticed I had to cut the out-of-range values myself, or else I ended up with a really gray output. (The gray output was the result of imageio compressing the full range, which was outside of [0, 256), to values that were inside the range.)



                                      There were a couple other oddities, too, which I mentioned in the comments.







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited May 10 '18 at 23:44

























                                      answered May 10 '18 at 23:39









                                      enigmaticPhysicistenigmaticPhysicist

                                      655613




                                      655613






























                                          draft saved

                                          draft discarded




















































                                          Thanks for contributing an answer to Stack Overflow!


                                          • Please be sure to answer the question. Provide details and share your research!

                                          But avoid



                                          • Asking for help, clarification, or responding to other answers.

                                          • Making statements based on opinion; back them up with references or personal experience.


                                          To learn more, see our tips on writing great answers.




                                          draft saved


                                          draft discarded














                                          StackExchange.ready(
                                          function () {
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f7762948%2fhow-to-convert-an-rgb-image-to-numpy-array%23new-answer', 'question_page');
                                          }
                                          );

                                          Post as a guest















                                          Required, but never shown





















































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown

































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown







                                          Popular posts from this blog

                                          Wiesbaden

                                          Marschland

                                          Dieringhausen