79 lines
2.3 KiB
Plaintext
79 lines
2.3 KiB
Plaintext
/*!
|
|
\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.
|
|
*/
|