LEADTOOLS Image Processing (Leadtools.ImageProcessing.Color assembly)
LEAD Technologies, Inc

RemapHueCommand Class

Example 





Members 
Uses a lookup table to change an image'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 Mask property. It is used for all resolutions, including 48 and 64-bit images. .NET support WinRT support Silverlight support
Object Model
RemapHueCommand Class
Syntax
'Declaration
 
Public Class RemapHueCommand 
   Inherits Leadtools.ImageProcessing.RasterCommand
   Implements Leadtools.ImageProcessing.IRasterCommand 
'Usage
 
Dim instance As RemapHueCommand
public sealed class RemapHueCommand : Leadtools.ImageProcessing.IRasterCommand  
function Leadtools.ImageProcessing.Color.RemapHueCommand()
Remarks
For more information, refer to Changing Brightness and Contrast.
Example
 
Public Function INCREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
   Return ((x + 1) Mod Length)
End Function
Public Function DECREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
   Return ((x + (Length - 1)) Mod Length)
End Function

Public Function ADD_S1(ByVal x As Integer, ByVal y As Integer, ByVal Length As Integer) As Integer
   Return ((x + y) Mod Length)
End Function


Public Sub RemapHueCommandCommandExample()
   Dim codecs As New RasterCodecs()
   codecs.ThrowExceptionsOnInvalidImages = True

   Dim leadImage As RasterImage = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "Master.jpg"))

   ' Prepare the command
   Dim MaskTable() As Integer
   Dim HueTable() As Integer
   Dim hsvRef As RasterHsvColor
   Dim HueGreen As Integer
   Dim HueChange As Integer

   Dim Change As Integer
   Dim i As Integer
   Dim Count As Integer
   Dim Length As Integer

   If (leadImage.BitsPerPixel >= 48) Then

      Length = 65536

   ElseIf (Not (leadImage.BitsPerPixel = 16 Or leadImage.BitsPerPixel = 12)) Then
      Length = 256
   ElseIf (IsNothing(leadImage.GetLookupTable) And leadImage.UseLookupTable) Then
      Length = 256
   Else
      Length = (1 << leadImage.BitsPerPixel)
   End If
   'Allocate tables
   ReDim MaskTable(Length - 1)
   ReDim HueTable(Length - 1)

   'Initialize tables
   For i = 0 To Length - 1
      MaskTable(i) = 0
      HueTable(i) = i
   Next

   'Get the hue for green
   hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(0, 255, 0))

   HueGreen = hsvRef.H

   'Obtain new hue  
   hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(255, 128, 0))
   Change = hsvRef.H - HueGreen
   If (Change > 0) Then
      HueChange = Change
   Else
      HueChange = Change + Length - 1
   End If

   HueGreen = (HueGreen * (Length - 1)) \ 255
   HueChange = (HueChange * (Length - 1)) \ 255

   'Set values in HueTable, MaskTable 
   HueTable(HueGreen) = HueTable(HueGreen) + HueChange
   MaskTable(HueGreen) = 1

   'set the hues near green (+/- 15)
   i = INCREMENT_S1(HueGreen, Length)

   For Count = (15 * (Length - 1)) \ 255 To 1 Step -1
      i = INCREMENT_S1(i, Length)
      HueTable(i) = ADD_S1(HueTable(i), HueChange, Length)
      MaskTable(i) = 1
   Next

   i = DECREMENT_S1(HueGreen, Length)

   For Count = (15 * (Length - 1)) \ 255 To 1 Step -1

      i = DECREMENT_S1(i, Length)
      HueTable(i) = ADD_S1(HueTable(i), HueChange, Length)
      MaskTable(i) = 1
   Next
   Dim command As RemapHueCommand = New RemapHueCommand(MaskTable, HueTable, Nothing, Nothing, Length)

   command.Run(leadImage)
   codecs.Save(leadImage, Path.Combine(LEAD_VARS.ImagesDir, "Result.jpg"), RasterImageFormat.Jpeg, 24)

End Sub

Public NotInheritable Class LEAD_VARS
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
public int INCREMENT_S1(int x, int Length)
   {
      return ((x + 1) % Length);
   }
   public int DECREMENT_S1(int x, int Length)
   {
      return ((x + (Length - 1)) % Length);
   }

   public int ADD_S1(int x, int y, int Length)
   {
      return ((x + y) % Length);
   }


   public void RemapHueCommandCommandExample()
   {
      // Load an image
      RasterCodecs codecs = new RasterCodecs();
      codecs.ThrowExceptionsOnInvalidImages = true;

      RasterImage image = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "Master.jpg"));

      // Prepare the command
      int[]  MaskTable;
      int[]  HueTable;
      RasterHsvColor hsvRef;
      int    HueGreen, HueChange;
      int    Change;
      int    i, Count;
      int    Length;

      if(image.BitsPerPixel >= 48)
         Length = 0x10000;
      else if(!(image.BitsPerPixel == 16 || image.BitsPerPixel == 12))
         Length = 256;
      else if(image.GetLookupTable() != null && image.UseLookupTable)
         Length = 256;
      else
         Length = (1 << image.BitsPerPixel);

      //Allocate tables
      MaskTable = new int[Length];
      HueTable  = new int[Length];

      //Initialize tables
      for (i = 0; i < Length; i++)
      {
         MaskTable[i] = 0;
         HueTable[i] = i;
      }

      //Get the hue for green
      hsvRef = RasterHsvColor.FromRasterColor(new RasterColor(0,255,0));

      HueGreen = hsvRef.H;

      //Obtain new hue  
      hsvRef =  RasterHsvColor.FromRasterColor(new RasterColor(255, 128, 0));
      Change = (int)hsvRef.H - (int)HueGreen;
      HueChange = (Change>0) ? (int)Change : (int)(Change + Length - 1);
      HueGreen   *= (Length - 1)/255;
      HueChange *= (Length - 1)/255;

      //Set values in HueTable, MaskTable 
      HueTable[HueGreen] = (HueTable[HueGreen] + HueChange);
      MaskTable[HueGreen] = 1;

      //set the hues near green (+/- 15)
      Count = (15 * (Length - 1))/255;
      for (i = INCREMENT_S1(HueGreen, Length); Count > 0; i = INCREMENT_S1(i, Length), Count--)
      {
         HueTable[i] = ADD_S1(HueTable[i], HueChange, Length);
         MaskTable[i] = 1;
      }

      Count = (15 * (Length - 1))/255;
      for (i = DECREMENT_S1(HueGreen, Length); Count > 0; i = DECREMENT_S1(i, Length), Count--)
      {
         HueTable[i] = ADD_S1(HueTable[i], HueChange, Length);
         MaskTable[i] = 1;
      }

      RemapHueCommand command = new RemapHueCommand(MaskTable, HueTable, null, null, Length);
      command.Run(image);
      codecs.Save(image, Path.Combine(LEAD_VARS.ImagesDir, "Result.jpg"), RasterImageFormat.Jpeg, 24);

   }

static class LEAD_VARS
{
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
public int INCREMENT_S1(int x, int Length)
{
   return ((x + 1) % Length);
}
public int DECREMENT_S1(int x, int Length)
{
   return ((x + (Length - 1)) % Length);
}

public int ADD_S1(int x, int y, int Length)
{
   return ((x + y) % Length);
}

[TestMethod]
public async Task RemapHueCommandCommandExample()
{
   // Load an image
   RasterCodecs codecs = new RasterCodecs();
   codecs.ThrowExceptionsOnInvalidImages = true;

   // Load the image
   string srcFileName = @"Assets\Image1.cmp";
   StorageFile loadFile = await Tools.AppInstallFolder.GetFileAsync(srcFileName);
   RasterImage image = await codecs.LoadAsync(LeadStreamFactory.Create(loadFile));

   // Prepare the command
   int[]  MaskTable;
   int[]  HueTable;
   RasterHsvColor hsvRef;
   int    HueGreen, HueChange;
   int    Change;
   int    i, Count;
   int    Length;

   if(image.BitsPerPixel >= 48)
      Length = 0x10000;
   else if(!(image.BitsPerPixel == 16 || image.BitsPerPixel == 12))
      Length = 256;
   else if(image.GetLookupTable() != null && image.UseLookupTable)
      Length = 256;
   else
      Length = (1 << image.BitsPerPixel);

   //Allocate tables
   MaskTable = new int[Length];
   HueTable  = new int[Length];

   //Initialize tables
   for (i = 0; i < Length; i++)
   {
      MaskTable[i] = 0;
      HueTable[i] = i;
   }

   //Get the hue for green
   hsvRef = RasterHsvColorHelper.FromRasterColor(RasterColorHelper.Create(0,255,0));

   HueGreen = hsvRef.H;

   //Obtain new hue  
   hsvRef =  RasterHsvColorHelper.FromRasterColor(RasterColorHelper.Create(255, 128, 0));
   Change = (int)hsvRef.H - (int)HueGreen;
   HueChange = (Change>0) ? (int)Change : (int)(Change + Length - 1);
   HueGreen   *= (Length - 1)/255;
   HueChange *= (Length - 1)/255;

   //Set values in HueTable, MaskTable 
   HueTable[HueGreen] = (HueTable[HueGreen] + HueChange);
   MaskTable[HueGreen] = 1;

   //set the hues near green (+/- 15)
   Count = (15 * (Length - 1))/255;
   for (i = INCREMENT_S1(HueGreen, Length); Count > 0; i = INCREMENT_S1(i, Length), Count--)
   {
      HueTable[i] = ADD_S1(HueTable[i], HueChange, Length);
      MaskTable[i] = 1;
   }

   Count = (15 * (Length - 1))/255;
   for (i = DECREMENT_S1(HueGreen, Length); Count > 0; i = DECREMENT_S1(i, Length), Count--)
   {
      HueTable[i] = ADD_S1(HueTable[i], HueChange, Length);
      MaskTable[i] = 1;
   }

   RemapHueCommand command = new RemapHueCommand(MaskTable, HueTable, null, null, Length);
   command.Run(image);

   string destFileName = @"result.jpg";
   StorageFile saveFile = await Tools.AppLocalFolder.CreateFileAsync(destFileName);
   await codecs.SaveAsync(image, LeadStreamFactory.Create(saveFile), RasterImageFormat.Jpeg, 0);
}
public int INCREMENT_S1(int x, int Length)
{
   return ((x + 1) % Length);
}
public int DECREMENT_S1(int x, int Length)
{
   return ((x + (Length - 1)) % Length);
}

public int ADD_S1(int x, int y, int Length)
{
   return ((x + y) % Length);
}

public void RemapHueCommandCommandExample(RasterImage image, Stream outStream)
{
   // Prepare the command
   int[]  MaskTable;
   int[]  HueTable;
   RasterHsvColor hsvRef;
   int    HueGreen, HueChange;
   int    Change;
   int    i, Count;
   int    Length;

   if(image.BitsPerPixel >= 48)
      Length = 0x10000;
   else if(!(image.BitsPerPixel == 16 || image.BitsPerPixel == 12))
      Length = 256;
   else if(image.GetLookupTable() != null && image.UseLookupTable)
      Length = 256;
   else
      Length = (1 << image.BitsPerPixel);

   //Allocate tables
   MaskTable = new int[Length];
   HueTable  = new int[Length];

   //Initialize tables
   for (i = 0; i < Length; i++)
   {
      MaskTable[i] = 0;
      HueTable[i] = i;
   }

   //Get the hue for green
   hsvRef = RasterHsvColor.FromRasterColor(new RasterColor(0,255,0));

   HueGreen = hsvRef.H;

   //Obtain new hue  
   hsvRef =  RasterHsvColor.FromRasterColor(new RasterColor(255, 128, 0));
   Change = hsvRef.H - HueGreen;
   HueChange = (Change>0) ? Change : (Change + Length - 1);
   HueGreen   *= (Length - 1)/255;
   HueChange *= (Length - 1)/255;

   //Set values in HueTable, MaskTable 
   HueTable[HueGreen] = (HueTable[HueGreen] + HueChange);
   MaskTable[HueGreen] = 1;

   //set the hues near green (+/- 15)
   Count = (15 * (Length - 1))/255;
   for (i = INCREMENT_S1(HueGreen, Length); Count > 0; i = INCREMENT_S1(i, Length), Count--)
   {
      HueTable[i] = ADD_S1((int)HueTable[i], HueChange, Length);
      MaskTable[i] = 1;
   }

   Count = (15 * (Length - 1))/255;
   for (i = DECREMENT_S1(HueGreen, Length); Count > 0; i = DECREMENT_S1(i, Length), Count--)
   {
      HueTable[i] = ADD_S1(HueTable[i], HueChange, Length);
      MaskTable[i] = 1;
   }

   RemapHueCommand command = new RemapHueCommand(MaskTable, HueTable, null, null, Length);
   command.Run(image);

   // Save result image
   RasterCodecs codecs = new RasterCodecs();
   codecs.Save(image, outStream, RasterImageFormat.Jpeg, 24);
   image.Dispose();
}
Public Function INCREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
   Return ((x + 1) Mod Length)
End Function
Public Function DECREMENT_S1(ByVal x As Integer, ByVal Length As Integer) As Integer
   Return ((x + (Length - 1)) Mod Length)
End Function

Public Function ADD_S1(ByVal x As Integer, ByVal y As Integer, ByVal Length As Integer) As Integer
   Return ((x + y) Mod Length)
End Function

Public Sub RemapHueCommandCommandExample(ByVal image As RasterImage, ByVal outStream As Stream)
   ' Prepare the command
   Dim MaskTable As Integer()
   Dim HueTable As Integer()
   Dim hsvRef As RasterHsvColor
   Dim HueGreen, HueChange As Integer
   Dim Change As Integer
   Dim i, Count As Integer
   Dim Length As Integer

   If image.BitsPerPixel >= 48 Then
      Length = &H10000
   Else If Not(image.BitsPerPixel = 16 OrElse image.BitsPerPixel = 12) Then
      Length = 256
   Else If Not image.GetLookupTable() Is Nothing AndAlso image.UseLookupTable Then
      Length = 256
   Else
      Length = (1 << image.BitsPerPixel)
   End If

   'Allocate tables
   MaskTable = New Integer(Length - 1){}
   HueTable = New Integer(Length - 1){}

   'Initialize tables
   i = 0
   Do While i < Length
      MaskTable(i) = 0
      HueTable(i) = i
      i += 1
   Loop

   'Get the hue for green
   hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(0,255,0))

   HueGreen = hsvRef.H

   'Obtain new hue  
   hsvRef = RasterHsvColor.FromRasterColor(New RasterColor(255, 128, 0))
   Change = hsvRef.H - HueGreen
   If (Change>0) Then
      HueChange = Change
   Else
      HueChange = (Change + Length - 1)
   End If
   HueGreen *= (Length - 1)/255
   HueChange *= (Length - 1)/255

   'Set values in HueTable, MaskTable 
   HueTable(HueGreen) = (HueTable(HueGreen) + HueChange)
   MaskTable(HueGreen) = 1

   'set the hues near green (+/- 15)
   Count = (15 * (Length - 1))/255
   i = INCREMENT_S1(HueGreen, Length)
   Do While Count > 0
      HueTable(i) = ADD_S1(CInt(HueTable(i)), HueChange, Length)
      MaskTable(i) = 1
      i = INCREMENT_S1(i, Length)
      Count -= 1
   Loop

   Count = (15 * (Length - 1))/255
   i = DECREMENT_S1(HueGreen, Length)
   Do While Count > 0
      HueTable(i) = ADD_S1(HueTable(i), HueChange, Length)
      MaskTable(i) = 1
      i = DECREMENT_S1(i, Length)
      Count -= 1
   Loop

   Dim command As RemapHueCommand = New RemapHueCommand(MaskTable, HueTable, Nothing, Nothing, Length)
   command.Run(image)

   ' Save result image
   Dim codecs As RasterCodecs = New RasterCodecs()
   codecs.Save(image, outStream, RasterImageFormat.Jpeg, 24)
   image.Dispose()
End Sub
Requirements

Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

See Also

Reference

RemapHueCommand Members
Leadtools.ImageProcessing.Color Namespace
Changing Brightness and Contrast
ChangeIntensityCommand Class
GammaCorrectCommand Class
ChangeContrastCommand Class
HistogramContrastCommand Class
StretchIntensityCommand Class
InvertCommand Class
ChangeHueCommand Class
ChangeSaturationCommand Class
HistogramEqualizeCommand Class
Leadtools.ImageProcessing.FillCommand
HistogramCommand Class
Leadtools.ImageProcessing.Core.WindowLevelCommand

 

 


Products | Support | Contact Us | Copyright Notices

© 2006-2012 All Rights Reserved. LEAD Technologies, Inc.