| /*! |
| \page BeforeAfterExample Histogram Example |
| |
| Actual commercial code that computes the luminosity histogram (variable names have been changed and unrelated parts removed): |
| |
| \code |
| void luminosity_hist(const uint8 *r, const uint8 *g, const uint8 *b, int rows, int cols, int sRowBytes, Histogram *hist) |
| { |
| for (int r=0; r<rows; r++) |
| { |
| for (int c=0; c<cols; c++) |
| { |
| int v=RGBToGray(r[c],g[c],b[c]); |
| (*hist)[v]++; |
| } |
| r+=sRowBytes; |
| g+=sRowBytes; |
| b+=sRowBytes; |
| } |
| } |
| \endcode |
| |
| - Works only for RGB (duplicate versions exist for other color spaces) |
| - Works only for 8-bit images (duplicate versions exist) |
| - Works only for planar images |
| |
| <p> Histogram using GIL: |
| |
| |
| \code |
| template <typename GrayView, typename R> |
| void grayimage_histogram(GrayView& img, R& hist) { |
| for (typename GrayView::iterator it=img.begin(); it!=img.end(); ++it) |
| ++hist[*it]; |
| } |
| |
| template <typename View, typename R> |
| void luminosity8bit_hist(View& img, R& hist) |
| { |
| grayimage_histogram(color_converted_view<gray8_pixel_t>(img),hist); |
| } |
| \endcode |
| |
| using \p boost::lambda the GIL version can be written even simpler: |
| \code |
| using boost::lambda; |
| |
| template <typename GrayView, typename R> |
| void grayimage_histogram(GrayView& img, R& hist) |
| { |
| for_each_pixel(img, ++var(hist)[_1]); |
| } |
| \endcode |
| |
| The GIL version: |
| - Works with any supported channel depth, color space, channel ordering (RGB vs BGR), and row alignment policy. |
| - Works for both planar and interleaved images. |
| - Works with new color spaces, channel depths and image types that can be provided in future extensions of GIL |
| - The second version is as efficient as the hand-coded version |
| |
| It is also very flexible. For example, to compute the histogram of the second channel of the top left quadrant of the image, |
| taking every other row and column, call: |
| |
| \code |
| grayimage_histogram( |
| nth_channel_view( |
| subsampled_view( |
| subimage_view(img, 0,0, img.width()/2,img.height()/2), // upper left quadrant |
| 2, 2 // skip every other row and column |
| ), |
| 1 // index of the second channel (for example, green for RGB) |
| ), |
| hist |
| ); |
| \endcode |
| |
| Note that no extra memory is allocated and no images are copied - GIL operates on the source pixels of \p img directly. |
| */ |