フレームを表示

L_RemapBitmapIntensity

フレームを表示

#include "l_bitmap.h"

L_LTIMGCLR_API L_INT L_RemapBitmapIntensitypBitmap、pLUT、uLUTLen、uFlags

pBITMAPHANDLE pBitmap;

/* ビットマップハンドルへのポインター*/

L_INT* pLUT;

/* ルックアップ値を格納しているuLUTLen整数の表*/

L_UINT uLUTLen;

/* ルックアップテーブルのlength*/

L_UINT uFlags;

/* カラープレーンインジケータ*/

ビットマップの明度値を変更するために、ルックアップテーブルを使います。

パラメーター

説明

pBitmap

変更されるためにビットマップを参照文に引用しているビットマップハンドルへのポインター。

pLUT

ルックアップ値を格納しているuLUTLen整数の表。

uLUTLen

ルックアップテーブルのlength。設定可能な値は、以下の通りです。

 

REMAP_NORMALフラグがuFlagsパラメーターで使われるならば、

 

2^(HighBit ― LowBit + 1)

 

REMAP_NORMALフラグがuFlagsパラメーターで使われないならば、

uFlags

以下を示すFlags:

  • 更新するカラープレーン。

  • 高位ビットを変更するべきですかどうか。

  • pLUTは、通常であるか引き伸ばされたデータを格納しますかどうか。

ビットごとのORを用いて適切なとき各々のグループの値を結合することができます( | )。以下は、有効値です:

 

Flagsは、更新するために、カラープレーンを示します:

 

意味

 

CHANNEL_MASTER*

[0] オールチャネル。

 

CHANNEL_RED

[1] Redチャネルだけ。

 

CHANNEL_GREEN

[2] 緑チャネルのみ。

 

CHANNEL_BLUE

[3] 青チャネルだけ。

 

フラグは、高位ビットを変更するべきかどうか示します:

 

REMAP_CHANGEHIGHBIT

[0x0010]、ビットマップの高位ビットを変更します(pBitmap->HighBit)pLUTの使い古したデータによって。

 

フラグは、pLUTが通常のデータを格納するかどうか示します:

 

REMAP_NORMAL

[0x0100]、uLUTLenが2^(HighBit ― LowBit + 1)と等しくなければならないというこの場合では、pLUTのデータは、通常のデータです。

戻り値

SUCCESS

関数は成功しました。

<1

エラーが発生しました。リターンコードを参照してください

コメント

赤いか、緑であるか、青であるか、全くカラーチャネルに、変更を適用することができます。

現在の明度値は、テーブルインデックスと一致します。エントリの値は、適用される新しい値です。

ビットマップ輝度レベル範囲は、imageの解像度に依存します。64ビット、48ビットと16ビットビットマップのために、輝度レベルは0から2^16-1にわたります。12ビットビットマップのために、輝度レベルは0から2^12-1にわたります。他の解像度のために、輝度レベルは0から255にわたります。

pLUTがビットマップ輝度レベルの数を格納するようにします。たとえば、ビットマップが16ビットであるならば、最大ビットマップ輝度レベルは2^16 1です。

この関数は、Photoshop曲線などのエンドユーザー機能を実装するのに用いられることができます。

状況表示バーを更新するか、この関数の実行の間、ユーザー割り込みを検出するために、L_SetStatusCallbackを参照します。

この関数は、12-と16ビットグレースケールと48-と64ビットカラーイメージをサポートします。12-と16ビットグレースケールと48-と64ビットカラーイメージのサポートは、DocumentとMedical画像化ツールキットで利用できます。

この関数は、32ビットグレースケールイメージをサポートしません。32ビットグレースケールimageがこの関数に渡されるならば、それはエラーコードERROR_GRAY32_UNSUPPORTEDを返します。

*マスターチャネル値を計算すること

LEADTOOLSで広く使われている画像処理フィルタの速度を上げるために、カラー画像のグレースケール値(マスターチャネル)は、以下の手法を用いて計算されます:

#define CalcGrayValue(r, g, b) ((L_UCHAR)(((L_UCHAR) (((2 * (L_UINT) (r)) + (5 * (L_UINT) (g)) + (L_UINT) (b) + 4) / 8))))
#define CalcGrayValue16(r, g, b) ((L_UINT16) (((2 * (L_UINT32) (r)) + (5 * (L_UINT32) (g)) + (L_UINT32) (b) + 4) / 8))
#define CalcGrayValue32(r, g, b) ((L_UINT32) (((2 * (L_UINT32) (r)) + (5 * (L_UINT32) (g)) + (L_UINT32) (b) + 4) / 8))

必須のDLLとライブラリ

LTIMGCLR

ツールキットバージョンに基づいた正確なDLLとライブラリのリストについては、「アプリケーションとともに配布するファイル」を参照してください

プラットホーム

Win32、x64、Linux

参照

関数:

L_GetUserLookUpTable, L_GetFunctionalLookUpTable, L_ChangeBitmapIntensity, L_GammaCorrectBitmap, L_ChangeBitmapContrast, L_HistoContrastBitmap, L_StretchBitmapIntensity, L_InvertBitmap, L_ChangeBitmapHue, L_ChangeBitmapSaturation, L_HistoEqualizeBitmap, L_FillBitmap, L_GetPixelColor, L_PutPixelColor, L_GetBitmapHistogram, L_WindowLevel, L_ChannelMix, L_DeinterlaceBitmap, L_DesaturateBitmap, L_EdgeDetectStatisticalBitmap, L_LightControlBitmap, L_SmoothEdgesBitmap, L_LocalHistoEqualizeBitmap, L_AddWeightedBitmaps, L_ColorMergeBitmap, L_ColorSeparateBitmap, L_ConvertColorSpace, L_MultiplyBitmap, L_AutoColorLevelBitmap, L_ColorLevelBitmap, L_CorrelationBitmap, L_GrayScaleToDuotone, L_GrayScaleToMultitone, L_HolesRemovalBitmapRgn, L_SelectiveColorBitmap, L_SkeletonBitmap, L_ChangeHueSatIntBitmap, L_ColorReplaceBitmap, L_ColorThresholdBitmap, L_MathFunctionBitmap, L_SegmentBitmap, L_AdaptiveContrastBitmap, L_ApplyMathLogicBitmap, L_ColorIntensityBalance, L_ColorizeGrayBitmap, L_ContBrightIntBitmap, L_DigitalSubtractBitmap, L_DynamicBinaryBitmap, L_EdgeDetectEffectBitmap, L_FunctionalLightBitmap, L_MultiScaleEnhancementBitmap, L_SelectBitmapData, L_ShiftBitmapData

トピック:

ラスター画像は機能します:輝度値の変更

 

明度とコントラストの変更

 

ラスター画像は機能します:明度とコントラストの変更

サンプル

このサンプルは、線形関数に影響を受けるルックアップテーブルを用いて、ロードしたビットマップを反転します

#define MAKE_IMAGE_PATH(pFileName) TEXT("C:\\Users\\Public\\Documents\\LEADTOOLS Images\\")pFileName


L_LTIMGTEX_API  L_INT RemapBitmapIntensityExample(L_VOID)
{
   L_INT nRet;
   L_UINT LookupTable[256];  /* Array to hold lookup table*/
   BITMAPHANDLE LeadBitmap; /*Bitmap handle to hold the loaded image */

   /* Load the bitmap, forced to 24 per pixel */
   nRet = L_LoadBitmap (MAKE_IMAGE_PATH(TEXT("sample5.cmp")), &LeadBitmap, sizeof(BITMAPHANDLE), 24, ORDER_BGR, NULL, NULL); 
   if(nRet !=SUCCESS)
      return nRet;
   /*Get Lookup table where the array calculated by the linear function for all the items of the array is from 0 - 255*/
   LookupTable[0] = 255;
   LookupTable[255] = 0; 
   nRet = L_GetFunctionalLookupTable ((L_INT *)LookupTable, 256,0, 255, 0, FLT_LINEAR);
   if(nRet !=SUCCESS)
      return nRet;
   nRet = L_RemapBitmapIntensity(&LeadBitmap, (L_INT *)LookupTable, 256, CHANNEL_MASTER);
   if(nRet !=SUCCESS)
      return nRet;
   nRet = L_SaveBitmap(MAKE_IMAGE_PATH(TEXT("Result.BMP")), &LeadBitmap, FILE_BMP, 24, 0, NULL);
   if(nRet !=SUCCESS)
      return nRet;
   //free bitmap 
   if(LeadBitmap.Flags.Allocated)  
      L_FreeBitmap(&LeadBitmap);  
   return SUCCESS;
}

//This example will convert all images to signed image and it will invert its data.
L_LTIMGTEX_API  L_INT RemapBitmapIntensity_Signed_Example(pBITMAPHANDLE pBitmap)
{
   L_INT          nRet;
   L_INT *        pLookupTable = NULL;  /* Array to hold lookup table*/
   L_INT          nMaxValue, nMinValue;
   L_INT          nLutLen;

   nLutLen = 1 << (pBitmap->HighBit - pBitmap->LowBit + 1);//Get the real LUT length

   if(!pBitmap->Flags.Signed)
      return FAILURE; //The image should be signed

   nMinValue   =  -1 * nLutLen/2; //This is the lowest expected value.
   nMaxValue   =  nLutLen/2 - 1;  //This is the highest expected value.


   pLookupTable = (L_INT *) malloc(nLutLen * sizeof(L_INT));
   if(pLookupTable == NULL)
      return ERROR_NO_MEMORY;

   memset(pLookupTable, 0, nLutLen * sizeof(L_INT));

   /*Get Lookup table where the array calculated by the linear function for all the items of the array is from 0 - nLutLen*/
   if(nMinValue < 0)
      pLookupTable[nMinValue + nLutLen]    = nLutLen/2 - 1;
   else
      pLookupTable[nMinValue]    = nLutLen/2 - 1;

   if(nMaxValue < 0)
      pLookupTable[nMaxValue + nLutLen]  = -1 * nLutLen/2; 
   else
      pLookupTable[nMaxValue]  = -1 * nLutLen/2;

   //Generate a negative LUT.
   nRet = L_GetFunctionalLookupTable (pLookupTable, nLutLen, -1 * nLutLen/2, nLutLen/2 - 1, 1, FLT_LINEAR|FLT_SIGNED);
   if (nRet != SUCCESS)
   {
      free(pLookupTable);
      return nRet;
   }

   //Invert the Image.
   nRet = L_RemapBitmapIntensity(pBitmap, pLookupTable, nLutLen, CHANNEL_MASTER|REMAP_NORMAL);
   if (nRet != SUCCESS)
   {
      free(pLookupTable);
      return nRet;
   }

   free(pLookupTable);

   return SUCCESS;
}