#include <mil.h>
void PrintHeader()
{
MosPrintf(MIL_TEXT("[EXAMPLE NAME]\n")
MIL_TEXT("WaveletTransformation\n\n")
MIL_TEXT("[SYNOPSIS]\n")
MIL_TEXT("This program performs a wavelet transformation and \n")
MIL_TEXT("then displays the resulting wavelet transforms.\n\n")
MIL_TEXT("[MODULES USED]\n")
MIL_TEXT("Modules used: application, system, display, buffer,\n")
MIL_TEXT("image processing.\n\n"));
}
MIL_CONST_TEXT_PTR SOURCE_IMAGE = M_IMAGE_PATH MIL_TEXT("lead.mim");
#define WAVELET_TYPE M_HAAR
#define TRANSFORMATION_MODE M_DYADIC
#define TRANSFORMATION_LEVEL 3
#define DRAW_OVERSCAN_COEF M_FALSE
void SourceCompensation(MIL_ID& MilSourceImage,
MIL_INT TransformationMode,
MIL_INT TransformationLevel);
int MosMain(void)
{
PrintHeader();
MIL_ID MilApplication,
MilSystem,
MilDisplayRe,
MilDisplayIm;
MIL_ID MilSourceImage,
MilDestinationRe,
MilDestinationIm,
MilWaveletContext,
MilWaveletResult;
MIL_INT SizeX,
SizeY,
SizeBand;
MIL_INT DestSizeX,
DestSizeY;
MIL_INT TransformationType;
MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, M_NULL, M_NULL, M_NULL);
MdispAlloc(MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &MilDisplayRe);
MdispAlloc(MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &MilDisplayIm);
MbufRestore(SOURCE_IMAGE, MilSystem, &MilSourceImage);
MdispSelect(MilDisplayRe, MilSourceImage);
MosPrintf(MIL_TEXT("\nThe source image is displayed.\n"));
MosPrintf(MIL_TEXT("Press <Enter> to continue.\n\n"));
MosGetch();
SourceCompensation(MilSourceImage, TRANSFORMATION_MODE, TRANSFORMATION_LEVEL);
MbufInquire(MilSourceImage, M_SIZE_X, &SizeX);
MbufInquire(MilSourceImage, M_SIZE_Y, &SizeY);
MbufInquire(MilSourceImage, M_SIZE_BAND, &SizeBand);
MimAlloc(MilSystem, M_WAVELET_TRANSFORM_CONTEXT, M_DEFAULT, &MilWaveletContext);
MimControl(MilWaveletContext, M_WAVELET_TYPE, WAVELET_TYPE);
MimControl(MilWaveletContext, M_TRANSFORMATION_MODE, TRANSFORMATION_MODE);
MimAllocResult(MilSystem, M_DEFAULT, M_WAVELET_TRANSFORM_RESULT, &MilWaveletResult);
MimWaveletTransform(MilWaveletContext, MilSourceImage, MilWaveletResult, M_FORWARD, TRANSFORMATION_LEVEL, M_DEFAULT);
if (DRAW_OVERSCAN_COEF==M_FALSE)
{
MimGetResult(MilWaveletResult, M_WAVELET_DRAW_SIZE_X, &DestSizeX);
MimGetResult(MilWaveletResult, M_WAVELET_DRAW_SIZE_Y, &DestSizeY);
}
else
{
MimGetResult(MilWaveletResult, M_WAVELET_DRAW_SIZE_X_WITH_PADDING, &DestSizeX);
MimGetResult(MilWaveletResult, M_WAVELET_DRAW_SIZE_Y_WITH_PADDING, &DestSizeY);
}
MimGetResult(MilWaveletResult, M_TRANSFORMATION_DOMAIN, &TransformationType);
if (TransformationType == M_REAL)
{
MbufAllocColor(MilSystem, SizeBand, DestSizeX, DestSizeY, 32 + M_FLOAT, M_IMAGE + M_PROC + M_DISP, &MilDestinationRe);
if (DRAW_OVERSCAN_COEF == M_FALSE)
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationRe, M_DRAW_WAVELET, 0, 0, M_AUTO_SCALE);
else
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationRe, M_DRAW_WAVELET_WITH_PADDING, 0, 0, M_AUTO_SCALE);
MosPrintf(MIL_TEXT("\nThe wavelet transformation coefficients are displayed.\n\n"));
MdispControl(MilDisplayRe, M_VIEW_MODE, M_AUTO_SCALE);
MdispSelect(MilDisplayRe, MilDestinationRe);
MdispControl(MilDisplayRe, M_TITLE, M_PTR_TO_DOUBLE(MIL_TEXT("Wavelet coefficients.")));
}
else
{
MbufAllocColor(MilSystem, SizeBand, DestSizeX, DestSizeY, 32 + M_FLOAT, M_IMAGE + M_PROC + M_DISP, &MilDestinationRe);
MbufAllocColor(MilSystem, SizeBand, DestSizeX, DestSizeY, 32 + M_FLOAT, M_IMAGE + M_PROC + M_DISP, &MilDestinationIm);
if (DRAW_OVERSCAN_COEF == M_FALSE)
{
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationRe, M_DRAW_WAVELET + M_REAL_PART, 0, 0, M_AUTO_SCALE);
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationIm, M_DRAW_WAVELET + M_IMAGINARY_PART, 0, 0, M_AUTO_SCALE);
}
else
{
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationRe, M_DRAW_WAVELET_WITH_PADDING + M_REAL_PART, 0, 0, M_AUTO_SCALE);
MimDraw(M_DEFAULT, MilWaveletResult, M_NULL, MilDestinationIm, M_DRAW_WAVELET_WITH_PADDING + M_IMAGINARY_PART, 0, 0, M_AUTO_SCALE);
}
MosPrintf(MIL_TEXT("\nThe wavelet transformation complex coefficients are displayed.\n\n"));
MdispControl(MilDisplayRe, M_VIEW_MODE, M_AUTO_SCALE);
MdispSelect(MilDisplayRe, MilDestinationRe);
MdispControl(MilDisplayRe, M_TITLE, M_PTR_TO_DOUBLE(MIL_TEXT("Complex wavelet coefficients (real part).")));
MdispControl(MilDisplayIm, M_VIEW_MODE, M_AUTO_SCALE);
MdispSelect(MilDisplayIm, MilDestinationIm);
MdispControl(MilDisplayIm, M_TITLE, M_PTR_TO_DOUBLE(MIL_TEXT("Complex wavelet coefficients (imaginary part).")));
}
MosPrintf(MIL_TEXT("Press <Enter> to terminate.\n\n"));
MosGetch();
MbufFree(MilSourceImage);
MbufFree(MilDestinationRe);
if(TransformationType == M_COMPLEX)
MbufFree(MilDestinationIm);
MimFree(MilWaveletContext);
MimFree(MilWaveletResult);
MdispFree(MilDisplayRe);
MdispFree(MilDisplayIm);
MappFreeDefault(MilApplication, MilSystem, M_NULL, M_NULL, M_NULL);
return 0;
}
void SourceCompensation(MIL_ID& MilSourceImage,
MIL_INT TransformationMode,
MIL_INT TransformationLevel)
{
if(TransformationMode == M_UNDECIMATED ||
TransformationMode == M_UNDECIMATED + M_CENTER)
{
MIL_INT SrcSizeX = MbufInquire(MilSourceImage, M_SIZE_X, M_NULL);
MIL_INT SrcSizeY = MbufInquire(MilSourceImage, M_SIZE_Y, M_NULL);
MIL_INT NewSrcSizeX = SrcSizeX;
MIL_INT NewSrcSizeY = SrcSizeY;
MIL_INT MaxLevelFactor = 1 << TransformationLevel;
if(SrcSizeX%MaxLevelFactor != 0)
NewSrcSizeX = SrcSizeX + MaxLevelFactor - SrcSizeX%MaxLevelFactor;
if (SrcSizeY%MaxLevelFactor != 0)
NewSrcSizeY = SrcSizeY + MaxLevelFactor - SrcSizeY%MaxLevelFactor;
if ((SrcSizeX != NewSrcSizeX) || (SrcSizeY != NewSrcSizeY))
{
MIL_ID NewMilSourceImage = MbufClone(MilSourceImage, M_DEFAULT, NewSrcSizeX, NewSrcSizeY, M_DEFAULT, M_DEFAULT, M_DEFAULT, M_NULL);
MbufClear(NewMilSourceImage, 0);
MbufCopy(MilSourceImage, NewMilSourceImage);
MbufFree(MilSourceImage);
MilSourceImage = NewMilSourceImage;
}
}
}