197 lines
7.9 KiB
C++
197 lines
7.9 KiB
C++
// Copyright (C) 2007 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#undef DLIB_ASSIGN_IMAGe_ABSTRACT
|
|
#ifdef DLIB_ASSIGN_IMAGe_ABSTRACT
|
|
|
|
#include "../pixel.h"
|
|
#include "../image_processing/generic_image.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename dest_image_type,
|
|
typename src_image_type
|
|
>
|
|
void assign_image (
|
|
dest_image_type& dest_img,
|
|
const src_image_type& src_img
|
|
);
|
|
/*!
|
|
requires
|
|
- src_image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or any object convertible to a matrix
|
|
via mat().
|
|
- dest_image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view.
|
|
ensures
|
|
- #dest_img.nc() == src_img.nc()
|
|
- #dest_img.nr() == src_img.nr()
|
|
- for all valid r and c:
|
|
- performs assign_pixel(#dest_img[r][c],src_img[r][c])
|
|
(i.e. copies the src image to dest image)
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename dest_image_type,
|
|
typename src_image_type
|
|
>
|
|
void assign_image_scaled (
|
|
dest_image_type& dest_img,
|
|
const src_image_type& src_img,
|
|
const double thresh = 4
|
|
);
|
|
/*!
|
|
requires
|
|
- src_image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or any object convertible to a matrix
|
|
via mat().
|
|
- dest_image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view.
|
|
- thresh > 0
|
|
ensures
|
|
- #dest_img.nc() == src_img.nc()
|
|
- #dest_img.nr() == src_img.nr()
|
|
- if (dest_img's pixels have a wide enough dynamic range to contain all the
|
|
pixels in src_img. (Note that dynamic range is determined by the min() and
|
|
max() pixel_traits properties)) then
|
|
- performs: assign_image(dest_img, src_img)
|
|
(i.e. in this case, no scaling is performed. Just a normal color space
|
|
conversion and copy )
|
|
- else
|
|
- #dest_img will be converted to a grayscale image
|
|
- scales the contents of src_img into the dynamic range of dest_img and then
|
|
assigns the result into dest_img. The thresh parameter is used to filter
|
|
source pixel values which are outliers. These outliers will saturate
|
|
at the edge of the destination image's dynamic range.
|
|
- Specifically, for all valid r and c:
|
|
- scales get_pixel_intensity(src_img[r][c]) into the dynamic range
|
|
of the dest_img. This is done using the mean and standard deviation
|
|
of src_img. Call the mean M and the standard deviation D. Then the
|
|
scaling from src_img to dest_img is performed using the following
|
|
mapping:
|
|
let SRC_UPPER = min(M + thresh*D, max(mat(src_img)))
|
|
let SRC_LOWER = max(M - thresh*D, min(mat(src_img)))
|
|
let DEST_UPPER = pixel_traits<image_traits<dest_image_type>::pixel_type>::max()
|
|
let DEST_LOWER = pixel_traits<image_traits<dest_image_type>::pixel_type>::min()
|
|
|
|
MAPPING: [SRC_LOWER, SRC_UPPER] -> [DEST_LOWER, DEST_UPPER]
|
|
|
|
Where this mapping is a linear mapping of values from the left range
|
|
into the right range of values. Source pixel values outside the left
|
|
range are modified to be at the appropriate end of the range.
|
|
|
|
The scaled pixel is then stored in dest_img[r][c].
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename dest_image_type,
|
|
typename src_pixel_type
|
|
>
|
|
void assign_all_pixels (
|
|
dest_image_type& dest_img,
|
|
const src_pixel_type& src_pixel
|
|
);
|
|
/*!
|
|
requires
|
|
- dest_image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view.
|
|
- pixel_traits<src_pixel_type> is defined
|
|
ensures
|
|
- #dest_img.nc() == dest_img.nc()
|
|
- #dest_img.nr() == dest_img.nr()
|
|
(i.e. the size of dest_img isn't changed by this function)
|
|
- for all valid r and c:
|
|
- performs assign_pixel(#dest_img[r][c],src_pixel)
|
|
(i.e. assigns the src pixel to every pixel in the dest image)
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_type
|
|
>
|
|
void assign_border_pixels (
|
|
image_type& img,
|
|
long x_border_size,
|
|
long y_border_size,
|
|
const typename image_traits<image_type>::pixel_type& p
|
|
);
|
|
/*!
|
|
requires
|
|
- image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view
|
|
- x_border_size >= 0
|
|
- y_border_size >= 0
|
|
ensures
|
|
- #img.nc() == img.nc()
|
|
- #img.nr() == img.nr()
|
|
(i.e. the size of img isn't changed by this function)
|
|
- for all valid r such that r+y_border_size or r-y_border_size gives an invalid row
|
|
- for all valid c such that c+x_border_size or c-x_border_size gives an invalid column
|
|
- performs assign_pixel(#img[r][c],p)
|
|
(i.e. assigns the given pixel to every pixel in the border of img)
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_type
|
|
>
|
|
void zero_border_pixels (
|
|
image_type& img,
|
|
long x_border_size,
|
|
long y_border_size
|
|
);
|
|
/*!
|
|
requires
|
|
- image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view
|
|
- x_border_size >= 0
|
|
- y_border_size >= 0
|
|
ensures
|
|
- #img.nc() == img.nc()
|
|
- #img.nr() == img.nr()
|
|
(i.e. the size of img isn't changed by this function)
|
|
- for all valid r such that r+y_border_size or r-y_border_size gives an invalid row
|
|
- for all valid c such that c+x_border_size or c-x_border_size gives an invalid column
|
|
- performs assign_pixel(#img[r][c], 0 )
|
|
(i.e. assigns 0 to every pixel in the border of img)
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename image_type
|
|
>
|
|
void zero_border_pixels (
|
|
image_type& img,
|
|
rectangle inside
|
|
);
|
|
/*!
|
|
requires
|
|
- image_type == an image object that implements the interface defined in
|
|
dlib/image_processing/generic_image.h or an image_view
|
|
ensures
|
|
- #img.nc() == img.nc()
|
|
- #img.nr() == img.nr()
|
|
(i.e. the size of img isn't changed by this function)
|
|
- All the pixels in img that are not contained inside the inside rectangle
|
|
given to this function are set to 0. That is, anything not "inside" is on
|
|
the border and set to 0.
|
|
!*/
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_ASSIGN_IMAGe_ABSTRACT
|
|
|
|
|