123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- /*
- * NICE-Core - efficient algebra and computer vision methods
- * - libimage - An image library
- * See file License for license information.
- */
- #ifndef LIMUN_CONVERT_H
- #define LIMUN_CONVERT_H
- #include "core/image/ippwrapper.h"
- #include "core/vector/VectorT.h"
- #include "core/image/Buffer.h"
- #include "core/image/GrayColorImageCommonImplementation.h"
- #include "core/image/RectT.h"
- #include "core/image/ImageT.h"
- #include "core/image/ColorImageT.h"
- #include <math.h>
- #include <limits>
- #include <iostream>
- namespace NICE {
- template<class P> class ColorImageT;
- template<class P> class ImageT;
- /**
- * @name Colorspace Conversion
- * \{
- */
- /**
- * Convert the HSV-ColorImage \c src into a RGB-ColorImage \c dst .
- * @param src source HSV image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- ColorImage* hsvToRGB(const ColorImage& src, ColorImage* dst=NULL);
- /**
- * Convert the RGB-ColorImage \c src into a HSV-ColorImage \c dst .
- * @param src source RGB image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- ColorImage* rgbToHSV(const ColorImage& src, ColorImage* dst=NULL);
- /**
- * Convert the YUV-ColorImage \c src into a RGB-ColorImage \c dst .
- * @param src source YUV image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c dst and \c src is not equal.
- */
- ColorImage* yuvToRGB(const ColorImage& src, ColorImage* dst=NULL);
- /**
- * Convert the RGB-ColorImage \c src into a YUV-ColorImage \c dst .
- * @param src source RGB image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c dst and \c src is not equal.
- */
- ColorImage* rgbToYUV(const ColorImage& src, ColorImage* dst=NULL);
- /**
- * \}
- * @name Gray-RGB Conversion
- * \{
- */
- /**
- * Create a lookup table of size 256x3 for faster rgbToGray conversion.
- * @return Pointer to ImageT<int>
- *
- */
- ImageT<int>* rgbToGrayLUT();
- /**
- * Convert the RGB-ColorImage \c src into a Image \c dst .
- * @param src source RGB image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @param rgbToGrayLUT optional lookup table (only if no Ipp is used and P = Ipp8u)
- * @return Pointer to Image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P>
- ImageT<P>* rgbToGray(const ColorImageT<P>& src, ImageT<P>* dst=NULL,
- const ImageT<int>* rgbToGrayLUT=NULL);
- /**
- * Convert the Image \c src into a RGB-ColorImage \c dst .
- * @param src source gray image
- * @param dst optional buffer to be used as target.<br>
- * Create a new gray image if \c dst == NULL.
- * @return Pointer to gray image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P>
- ColorImageT<P>* grayToRGB(const ImageT<P>& src, ColorImageT<P>* dst=NULL);
- /**
- * convert a gray value to RGB pseudo colors (gray value must be between 0 and 1)
- */
- void convertToPseudoColor ( double x, double & r, double & g, double & b );
- /**
- * Convert the Image \c src into a RGB-ColorImage \c dst using pseudo colors.
- * @param src source gray image
- * @param dst result image
- */
- template<class P>
- void imageToPseudoColor ( const NICE::ImageT<P> & src, NICE::ColorImage & dst );
-
- /**
- * Convert the Image \c src into a RGB-ColorImage \c dst using pseudo colors.
- * @param src source gray image
- * @param dst result image
- * @param _min desired lower bound (smaller initial values will be set to zero after conversion)
- * @param _max desired upper bound (larger initial values will be set to 255 after conversion)
- * @author Alexander Freytag
- * @date 17-04-2013 (dd-mm-yyyy)
- */
- template<class P>
- void imageToPseudoColorWithRangeSpecification ( const NICE::ImageT<P> & src, NICE::ColorImage & img, const double & _min, const double & _max );
- /**
- * Convert the matrix \c src into a RGB-ColorImage \c dst using pseudo colors.
- * @param src source gray image
- * @param dst result image
- */
- template<class P>
- void matrixToPseudoColor ( const NICE::MatrixT<P> & m, NICE::ColorImage & img );
- /**
- * Convert a signed image into a colored image
- * (white positiv values, red negativ values).
- * @note usefull to display float or signed images
- * @param src source gray image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- */
- template<class P>
- ColorImage* signedImageToRGB(const ImageT<P>& src, ColorImageT<Ipp8u>* dst=NULL);
- /**
- * \}
- * @name Gray-Float Conversion
- * \{
- */
- /**
- * Convert the gray image \c src into a float image \c dst .
- * @param src source gray image.
- * @param dst optional buffer to be used as target.<br>
- * Create a new FloatImage if \c dst == NULL.
- * @return Pointer to FloatImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P>
- FloatImage* grayToFloat(const ImageT<P>& src, FloatImage* dst=NULL);
- /**
- * Convert the float image \c src into a gray image \c dst just rounded (not scaled).
- * @param src source float image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @param roundMode rounding mode for floating point conversion
- * - ippRndZero : floating-point value will be truncated toward zero
- * - ippRndNear : floating-point value will be rounded to the nearest integer
- * @return Pointer to Image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P>
- ImageT<P>* floatToGray(const FloatImage& src, ImageT<P>* dst=NULL,
- IppRoundMode roundMode=ippRndNear);
- /**
- * Convert the float image \c src into a gray image \c dst by scaling with p' = 255/(fmax-fmin)*(p-fmin).
- * @param src source float image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to Image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- Image* floatToGrayScaled(const FloatImage& src, Image* dst=NULL);
- /**
- * Convert the float image \c src into a gray image \c dst by scaling with p' = 255/(\c fmax-\c fmin)*(p-\c fmin) .
- * @param src source float image
- * @param fmin minimum float value
- * @param fmax maximum float value
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to Image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- Image* floatToGrayScaled(const FloatImage& src, Ipp32f fmin, Ipp32f fmax, Image* dst=NULL);
- /**
- * \}
- * @name RGB-Float Conversion
- * \{
- */
- /**
- * Convert the RGB-ColorImage \c src into a FloatImage \c dst containing all rgb values.<br>
- * Result image is 3 times wider.
- * @param src source RGB image
- * @param dst optional buffer to be used as target.<br>
- * Create a new FloatImage if \c dst == NULL.
- * @return Pointer to FloatImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- FloatImage* rgbToFloat(const ColorImage& src, FloatImage* dst = NULL);
- /**
- * \}
- * @name BitDepth Conversion
- * \{
- */
- /**
- * @example image_convert.cpp
- */
- /**
- * Convert the gray image \c src to a gray image \c dst with a different bitdepth.
- * @note Ipp only supports the following conversions:
- * - 8u16u, 8u16s, 8u32s, 8s32s, 16u32s
- * - 8u32f, 8s32f, 16u32f, 16s32f
- * - 16u8u, 16s8u, 32s8u, 32s8s
- * - 32f8u, 32f8s, 32f16u, 32f16s
- * @param src source gray image
- * @param dst optional buffer to be used as target.<br>
- * Create a new Image if \c dst == NULL.
- * @return Pointer to Image
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P1, class P2>
- ImageT<P2>* convertBitDepth(const ImageT<P1>& src, ImageT<P2>* dst);
- /**
- * Convert the color image \c src to a color image \c dst with a different bitdepth.
- * @note Ipp only supports the following conversions:
- * - 8u16u, 8u16s, 8u32s, 8s32s, 16u32s
- * - 8u32f, 8s32f, 16u32f, 16s32f
- * - 16u8u, 16s8u, 32s8u, 32s8s
- * - 32f8u, 32f8s, 32f16u, 32f16s
- * @param src source color image
- * @param dst optional buffer to be used as target.<br>
- * Create a new ColorImage if \c dst == NULL.
- * @return Pointer to ColorImage
- * @throw ImageException will be thrown if \c dst != NULL and the size of \c src and \c dst is not equal.
- */
- template<class P1, class P2>
- ColorImageT<P2>* convertBitDepth(const ColorImageT<P1>& src, ColorImageT<P2>* dst);
- /**
- * \}
- * @name Interpolation
- * @note This functions are only available with ipp support.
- * \{
- */
- /**
- * Remap Image src into the Image dst using lookup tables.
- * @param src source gray image
- * @param dst destination gray image
- * @param px 2D float image containing new x coordinate
- * @param py 2D float image containing new y coordinate
- * @param interpolation interpolation type (IPPI_INTER_NN|IPPI_INTER_LINEAR|IPPI_INTER_CUBIC)
- * nearest neighbor interpolation, linear interpolation or cubic interpolation
- * @return Pointer to Image
- */
- Image* remap(const Image& src, const FloatImage &px, const FloatImage &py,
- Image* dst = NULL, int interpolation=IPPI_INTER_LINEAR);
- /**
- * Remap ColorImage src into the ColorImage dst using lookup tables.
- * @param src source RGB image
- * @param dst destination RGB image
- * @param px 2D float image containing new x coordinate
- * @param py 2D float image containing new y coordinate
- * @param interpolation interpolation type (IPPI_INTER_NN|IPPI_INTER_LINEAR|IPPI_INTER_CUBIC)
- * nearest neighbor interpolation, linear interpolation or cubic interpolation
- * @return Pointer to ColorImage
- */
- ColorImage* remap(const ColorImage& src, const FloatImage &px, const FloatImage &py,
- ColorImage* dst = NULL, int interpolation=IPPI_INTER_LINEAR);
- /**
- * Scale ImageT src into the ImageT dst using scale factors xFactor and yFactor.
- * @param src source ImageT
- * @param dst destination ImageT
- * @param xFactor factor for scaling the x-axis if 0 it is caculated by src vs. dst
- * @param yFactor factor for scaling the y-axis if 0 it is caculated by src vs. dst
- * @param interpolation interpolation type
- * (IPPI_INTER_NN|IPPI_INTER_LINEAR|IPPI_INTER_CUBIC)
- * nearest neighbor interpolation, linear interpolation
- * or cubic interpolation
- * @return Pointer to ImageT<P>
- */
- template<class P>
- ImageT<P>* scale(const ImageT<P>& src, ImageT<P>* dst,
- double xFactor=0.0, double yFactor=0.0,
- int interpolation=IPPI_INTER_LINEAR);
- //! see scale()
- template<class P>
- inline ImageT<P>* resize(const ImageT<P>& src, ImageT<P>* dst,
- double xFactor=0.0, double yFactor=0.0,
- int interpolation=IPPI_INTER_LINEAR) {
- return scale(src, dst, xFactor, yFactor, interpolation);
- }
- /**
- * Scale ColorImageT src into the ColorImageT dst using scale factors xFactor and yFactor.
- * @param src source ColorImageT
- * @param dst destination ColorImageT
- * @param xFactor factor for scaling the x-axis if 0 it is caculated by src vs. dst
- * @param yFactor factor for scaling the y-axis if 0 it is caculated by src vs. dst
- * @param interpolation interpolation type (IPPI_INTER_NN|IPPI_INTER_LINEAR|IPPI_INTER_CUBIC)
- * nearest neighbor interpolation, linear interpolation or cubic interpolation
- * @return Pointer to ColorImageT<P>
- */
- template<class P>
- ColorImageT<P>* scale(const ColorImageT<P>& src, ColorImageT<P>* dst,
- double xFactor=0.0, double yFactor=0.0,
- int interpolation=IPPI_INTER_LINEAR);
- //! see scale()
- template<class P>
- inline ColorImageT<P>* resize(const ColorImageT<P>& src, ColorImageT<P>* dst,
- double xFactor=0.0, double yFactor=0.0,
- int interpolation=IPPI_INTER_LINEAR) {
- return scale(src, dst, xFactor, yFactor, interpolation);
- }
- /**
- * @name Some Helper Functions
- * \{
- */
- /**
- * Clip a \c rect within \c image.
- * @param image The image
- * @param rect The rectangle
- * @return \c Rect
- */
- Rect clipRect(const MultiChannelImageAccess& image, const Rect& rect);
- /**
- * Make an \c IppiRect for the full image.
- * @param image The image
- * @return \c IppiRect
- */
- IppiRect makeRectFullImage(const MultiChannelImageAccess& image);
- /**
- * Make an \c IppiSize for the full image.
- * @param image The image
- * @return \c IppiSize
- */
- IppiSize makeROIFullImage(const MultiChannelImageAccess& image);
- /**
- * Get an \c IppiSize for \c rect clipped within \c image.
- * @param image The image
- * @param rect The rectangle
- * @return \c IppiSize
- */
- IppiSize makeROIRect(const MultiChannelImageAccess& image, const Rect& rect);
- /**
- * Work around a certain IPP bug (?).
- * @param ippiSize input and output
- * @param clippedROI input and output
- */
- void preventIppBug(IppiSize& ippiSize, Rect& clippedROI);
- } // namespace
- //#ifdef __GNUC__
- #include <core/image/Convert.tcc>
- //#endif
- #endif // LIMUN_CONVERT_H
|