Getting RGB values for each pixel from a raw image in C

后端 未结 3 1794
迷失自我
迷失自我 2021-01-02 20:46

I want to read the RGB values for each pixel from a raw image. Can someone tell me how to achieve this? Thanks for help!

the format of my raw image is .CR2 which com

相关标签:
3条回答
  • 2021-01-02 20:54

    A RAW image is an uncompressed format, so you just have to point where your pixel is (skipping any possible header, and then adding the size of the pixel times the number columns times the number of row plus the number of the colum), and then read whatever binary data is giving a meaningful format to the layout of the data (with masks and shifts, you know).

    That's the general procedure, for your current format you'll have to check the details.

    0 讨论(0)
  • 2021-01-02 21:00

    None of the methods posted so far are likely to work with a camera "raw" file. The file formats for raw files are proprietary to each manufacturer, and may contain exposure data, calibration constants, and white balance information, in addition to the pixel data, which will likely be in a packed format where each pixel can takes up more than one byte, but less than two.

    I'm sure there are open-source raw file converter programs out there that you could consult to find out the algorithms to use, but I don't know of any off the top of my head.


    Just thought of an additional complication. The raw file does not store RGB values for each pixel. Each pixel records only one color. The other two colors have to be interpolated from heighboring pixels. You'll definitely be better off finding a program or library that works with your camera.

    0 讨论(0)
  • 2021-01-02 21:17

    Assuming the image is w * h pixels, and stored in true "packed" RGB format with no alpha component, each pixel will require three bytes.

    In memory, the first line of the image might be represented in awesome ASCII graphics like this:

       R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1)
    

    Here, each Rn Gn and Bn represents a single byte, giving the red, green or blue component of pixel n of that scanline. Note that the order of the bytes might be different for different "raw" formats; there's no agreed-upon world standard. Different environments (graphics cards, cameras, ...) do it differently for whatever reason, you simply have to know the layout.

    Reading out a pixel can then be done by this function:

    typedef unsigned char byte;
    void get_pixel(const byte *image, unsigned int w,
                   unsigned int x,
                   unsigned int y,
                   byte *red, byte *green, byte *blue)
    {
        /* Compute pointer to first (red) byte of the desired pixel. */
        const byte * pixel = image + w * y * 3 + 3 * x;
        /* Copy R, G and B to outputs. */
        *red = pixel[0];
        *green = pixel[1];
        *blue = pixel[2];
    }
    

    Notice how the height of the image is not needed for this to work, and how the function is free from bounds-checking. A production-quality function might be more armor-plated.

    Update If you're worried this approach will be too slow, you can of course just loop over the pixels, instead:

    unsigned int x, y;
    const byte *pixel = /* ... assumed to be pointing at the data as per above */
    
    for(y = 0; y < h; ++y)
    {
      for(x = 0; x < w; ++x, pixel += 3)
      {
        const byte red = pixel[0], green = pixel[1], blue = pixel[2];
    
        /* Do something with the current pixel. */
      }
    }
    
    0 讨论(0)
提交回复
热议问题