LBitmap::RemapHue

#include "ltwrappr.h"

virtual L_INT LBitmap::RemapHue(pMask, pHTable, pSTable, pVTable, uLUTLen, uFlags = 0)

L_UINT * pMask;

/* table of 256 bytes identifying valid values in hue table */

L_UINT * pHTable;

/* table of 256 bytes representing the hue lookup table */

L_UINT * pSTable;

/* table of 256 bytes representing the saturation lookup table */

L_UINT * pVTable;

/* table of 256 bytes representing the value lookup table */

L_UINT uLUTLen;

/* length of the lookup table */

L_UINT32 uFlags;

/* flags */

Uses a lookup table to change a bitmap's hue values. The saturation and value tables change S and V values only if a particular hue value is marked as non-zero in the pMask table. It is used for all resolutions, including 48 and 64-bit images. Support for 48 and 64-bit images is available only in the Document/Medical toolkits.

Parameter

Description

pMask

Lookup table that identifies which values in the pHTable, pSTable and pVTable are valid. If pMask[i] is non-zero, then pHTable, pSTable and pVTable are to be used. If pMask[i] is 0 then pHTable, pSTable and pVTable are ignored. If pMask is NULL, all entries in the pHTable, pSTable and pVTable are used.

pHTable

Hue look up table. If the pMask table value for a particular pixel hue is non-zero, then the hue is changed to the corresponding entry in pHTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the hue is changed to pHTable[85]. If pHTable is NULL, the hue of each pixel is unchanged.

pSTable

Saturation look up table. If the pMask table value for a particular pixel hue is non-zero, then the saturation is changed to the corresponding entry in pSTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the saturation is changed to pSTable[85]. If pHTable is NULL, the saturation is changed to pSTable[85]. If pSTable is NULL, the saturation of each pixel is unchanged.

pVTable

Value look up table. If the pMask table value for a particular pixel hue is non-zero, then the value is changed to the corresponding entry in pVTable. For example, if a pixel value has a hue of 85 and pMask[85] is non-zero, the value is changed to pVTable[85]. If pHTable is NULL, the value is changed to pVTable[85]. If pVTable is NULL, the value of each pixel is unchanged.

uLUTLen

Length of the lookup table. Possible values are:

 

Value

Meaning

 

65536

16-bit image

 

4096

12-bit image

 

256

8-bit image

uFlags

Reserved for future use. Must be 0.

Returns

SUCCESS

The function was successful.

< 1

An error occurred. Refer to Return Codes.

Comments

This function can be used to change a range of colors to another range of colors. For example, it could be used to change all red pixels to any color, where a red pixel can have any brightness (V) and any amount of white (saturation). A red pixel in this case would be

RGB(x,y,y) where

0<=x<(uLUTLen  1) and 

0<=y<x

or in the HSV color space

HSV(0,x,x) where 

0<=x<=(uLUTLen  1)

The pMask lookup table identifies which values in the pHTable are valid. If a pMask value is 0, then the corresponding value in the pHTable is ignored. If a pMask value is non-zero, then the corresponding value in the pHTable is used. For example, if a pixel has a hue value of 240 and pMask[240] is nonzero, then the hue value of 240 is replaced with pHTable[240]. Traditionally, hue ranges from 0 to 359. For the lookup table, the range of 0 to 359 is remapped to a range of 0.. uLUTLen 1. For example, if uLUTLen = 256

 

Color

Hue(0..359)

Hue(0..255)

Red

0

0

Green

120

85

Blue

240

170

To update a status bar or detect a user interrupt during execution of this function, refer to LBase::EnableStatusCallback.

This function supports 48 and 64-bit color images. Support for 48 and 64-bit color images is available only in the Document/Medical toolkits.

This function does not support signed data images. It returns the error code ERROR_SIGNED_DATA_NOT_SUPPORTED if a signed data image is passed to this function.

This function does not support 32-bit grayscale images. It returns the error code ERROR_GRAY32_UNSUPPORTED if a 32-bit grayscale image is passed to this function.

Required DLLs and Libraries

LTDIS
LTFIL
LTIMGCLR

For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.

See Also

Functions:

LBitmap::ChangeIntensity, LBitmap::GammaCorrect, LBitmap::HistoContrast, LBitmap::StretchIntensity, LBitmap::RemapIntensity, LBitmap::Invert, LBitmap::ChangeContrast, LBitmap::ChangeSaturation, LBitmap::HistoEqualize, LBitmap::GetHistogram, LBitmap::WindowLevel, LBitmapBase::Fill, LBitmapBase::GetPixelColor, LBitmapBase::PutPixelColor, LBitmapRgn::SetRgnColorHSVRange, LBitmapRgn::SetRgnColorRGBRange, Class Members

Topics:

Raster Image Functions: Modifying Intensity Values

 

Correcting Colors

 

Using Color Values in LEADTOOLS

 

Raster Image Functions: Changing Brightness and Contrast

Example

// The example uses the following macros: 
#define INCREMENT(x, uLUTLen) ((x+1)% uLUTLen) 
#define DECREMENT(x, uLUTLen) ((x+ (uLUTLen - 1))% uLUTLen) 
#define ADD(x,y, uLUTLen)     ((x+y)% uLUTLen) 
L_INT LBitmap__RemapHueExample(LBitmap * pBitmap, COLORREF crNewColor) 
{
   UNREFERENCED_PARAMETER(crNewColor);
   L_UINT   * uMaskTable; 
   L_UINT   * uHueTable; 
   L_UINT uHueGreen, uHueChange; 
   L_INT   iHueChange; 
   L_INT   i, iCount, nRet, uLUTLen; 
   
   if(pBitmap->GetBitsPerPixel() >= 48) 
      uLUTLen = 0x10000; 
   else if(pBitmap->IsGrayScale())
      uLUTLen = 256; 
   else if((pBitmap->GetHandle())->pLUT && (pBitmap->GetHandle())->Flags.UseLUT) 
      uLUTLen = 256; 
   else
      uLUTLen = (1 << pBitmap->GetBitsPerPixel ());
   //Allocate tables
   uMaskTable = (L_UINT *)malloc (uLUTLen * sizeof(L_UINT)); 
   uHueTable  = (L_UINT *)malloc (uLUTLen * sizeof(L_UINT)); 
   //Initialize tables
   for (i=0; i<uLUTLen; i++)
   {
      uMaskTable[i] = 0; 
      uHueTable[i] = i; 
   }
   //Get the hue for green
   uHueGreen = RGB(0,255,0); 
   //Obtain new hue
   iHueChange = (L_INT)RGB(0,255,0) - (L_INT)uHueGreen; 
   uHueChange = (iHueChange>0) ? (L_UINT)iHueChange : (L_UINT)(iHueChange + (uLUTLen - 1)); 
   uHueGreen   *= (uLUTLen - 1)/255; 
   uHueChange *= (uLUTLen - 1)/255; 
   //Set values in uHueTable, uMaskTable 
   uHueTable[uHueGreen] = (uHueTable[uHueGreen] + uHueChange); 
   uMaskTable[uHueGreen] = 1; 
   
   //set the hues near green (+/- 15) 
   iCount = (15 * (uLUTLen - 1))/255; 
   for (i=INCREMENT(uHueGreen,uLUTLen); iCount > 0; i = INCREMENT(i, uLUTLen), iCount--)
   {
      uHueTable[i] = ADD(uHueTable[i], uHueChange, uLUTLen); 
      uMaskTable[i] = 1; 
   }
  iCount = (15 * (uLUTLen - 1))/255; 
   for (i=DECREMENT(uHueGreen, uLUTLen); iCount > 0; i =DECREMENT(i, uLUTLen), iCount--)
   {
      uHueTable[i] = ADD(uHueTable[i],uHueChange, uLUTLen); 
      uMaskTable[i] = 1; 
   }
   
   nRet = pBitmap->RemapHue(uMaskTable, uHueTable, NULL, NULL, uLUTLen); 
   
   if(uMaskTable) 
      free(uMaskTable); 
   if(uHueTable) 
      free (uHueTable); 
   return nRet; 
}