|
Boost : |
From: Pavel Chikulaev (pavel.chikulaev_at_[hidden])
Date: 2006-06-08 13:58:15
Lubomir Bourdev wrote:
> Hello,
>
> We have developed the Generic Image Library (GIL) - a library that
> abstracts away the image representation from algorithms written for
> images. It allows for writing the algorithm once and having it work for
> images in any color space, channel depth and pixel organization with
> performance comparable to writing the code for each specific image
> format.
>
> GIL is currently part of the Adobe Open Source Libraries and we use it
> for several imaging projects inside Adobe. Its only dependency is boost.
>
> You can find the sources and documentation at GIL's home page:
>
> http://opensource.adobe.com/gil
>
> Is there an interest for having GIL be a boost library?
> Also, I would appreciate any recommendations for improving the design of
> GIL.
Sure there is, but I do think that this library is not flexible enough -
image layout (RGB and RGB classes).
I've got my own small library that is on an early stage of development.
Some examples of library:
Example 1. Defining your own image format with default planar layout:
namespace rgb
{
struct tag;
struct red {} const red;
struct green {} const green;
struct blue {} const blue;
}
typedef colorspace<
rgb::tag,
channels<
channel<struct rgb::red, bits<8> >, //or uint8
channel<struct rgb::green, bits<8> >, //can be also float
for example
channel<struct rgb::blue, bits<8> >
>
rgb24_colorspace;
typedef image<rgb24_colorspace> rgb8_image;
void foo()
{
rgb24_image img;
using namespace rgb;
img.resize(100, 100);
img(0, 0, red) = 255;
img(0, 0, blue) = 25
img(1, 1) = rgb8_image::pixel_type(128, 128, 128);
}
For every colorspace one could define layout. The default is planar (in
terms of GIL) (i.g. R G B R G B). To layout data in B G R order or some
other there is no need to change the colorspace as you have to do in GIL.
Example of layout declaration:
typedef layout<
rgb24_colorspace,
row_major,
alignment<
row_alignment<4>
>,
allocator<std::allocator>,
position<
interleaved,
// B B B B ... G G G G ... R R R R ...
positions<struct rgb::blue, struct rgb::green, struct rgb::red>
>
> my_rgb24_layout;
typedef image<rgb24_colorspace, my_rgb24_layout> myrgb24image;
Other features:
* Images with same colorspaces but different layouts are treated the
same way.
* Mutable and immutable views of image are available, such as
channel_view (mutable).
* Row, column, channel, different sliding-windows and layout-specific
iterators are available.
* Abilility to add custom implicit and explicit colorspace
transformation algorithms (such as sRGB to CIE Lab).
* Pixel-to-Pixel transformations on images.
* Predefined support for RGB(sRGB and Adobe RGB), RGBA, CMY, CMYK, HSV,
HSL, CIE Lab, CIE Luv, XYZ, YCbCr colorspaces and transformations
between them.
* Some algorithms on images (FIR filtering, contrast enhancement,
histogram equalization, etc).
Unresolved issues:
* Whether support packed formats such as RGB565, RGB555 or not...
* Whether support indexed images or not...
The current implementation uses state-of-the-art Boost.Fusion library.
Is there any interest and need in such additional flexibility (with some
compile-time cost of course) ?
-- Pavel Chikulaev
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk