Пример #1
0
void imProcessCrossCorrelation(const imImage* src_image1, const imImage* src_image2, imImage* dst_image)
{
  imImage *tmp_image = imImageCreate(src_image2->width, src_image2->height, src_image2->color_space, IM_COMPLEX);
  if (!tmp_image) 
    return;

  if (src_image2->data_type != IM_COMPLEX)
    imConvertDataType(src_image2, tmp_image, 0, 0, 0, 0);
  else
    imImageCopy(src_image2, tmp_image);

  if (src_image1->data_type != IM_COMPLEX)
    imConvertDataType(src_image1, dst_image, 0, 0, 0, 0);
  else
    imImageCopy(src_image1, dst_image);

  imProcessFFTraw(tmp_image, 0, 1, 1);   // forward, centered, normalized
  imProcessFFTraw(dst_image, 0, 1, 1);

  imProcessMultiplyConj(dst_image, tmp_image, dst_image);

  imProcessFFTraw(dst_image, 1, 1, 1);   // inverse, uncentered, normalized
  imProcessSwapQuadrants(dst_image, 0);  // from origin to center

  imImageDestroy(tmp_image);
}
Пример #2
0
void imProcessFFT(const imImage* src_image, imImage* dst_image)
{
  if (src_image->data_type != IM_COMPLEX)
    imConvertDataType(src_image, dst_image, 0, 0, 0, 0);
  else
    imImageCopy(src_image, dst_image);

  imProcessFFTraw(dst_image, 0, 1, 0); // forward, centered, unnormalized
}
Пример #3
0
void imProcessAutoCorrelation(const imImage* src_image, imImage* dst_image)
{
  if (src_image->data_type != IM_COMPLEX)
    imConvertDataType(src_image, dst_image, 0, 0, 0, 0);
  else
    imImageCopy(src_image, dst_image);

  imProcessFFTraw(dst_image, 0, 0, 1);   // forward, at origin, normalized

  imProcessMultiplyConj(dst_image, dst_image, dst_image);

  imProcessFFTraw(dst_image, 1, 0, 1);   // inverse, at origin, normalized
  imProcessSwapQuadrants(dst_image, 0);  // from origin to center
}
Пример #4
0
int imConvertToBitmap(const imImage* src_image, imImage* dst_image, int cpx2real, float gamma, int absolute, int cast_mode)
#endif
{
    assert(src_image);
    assert(dst_image);

    if (!imImageMatchSize(src_image, dst_image) || !imImageIsBitmap(dst_image))
        return IM_ERR_DATA;

#ifdef IM_PROCESS
    int counter = imProcessCounterBegin("Building Bitmap");
#else
    int counter = imCounterBegin("Building Bitmap");
#endif

    int ret;
    if (src_image->data_type == IM_BYTE)
    {
        // NO data type conversion, only color mode conversion
#ifdef IM_PROCESS
        ret = imProcessConvertColorSpace(src_image, dst_image);
#else
        ret = imConvertColorSpace(src_image, dst_image);
#endif
    }
    else
    {
        if (src_image->color_space == IM_RGB ||
                src_image->color_space == IM_GRAY)
        {
            // data type conversion, but NO color mode conversion
#ifdef IM_PROCESS
            ret = imProcessConvertDataType(src_image, dst_image, cpx2real, gamma, absolute, cast_mode);
#else
            ret = imConvertDataType(src_image, dst_image, cpx2real, gamma, absolute, cast_mode);
#endif
        }
        else
        {
            // data type conversion AND color mode conversion
            imImage* temp_image = imImageCreate(src_image->width, src_image->height, dst_image->color_space, src_image->data_type);
            if (!temp_image)
                ret = IM_ERR_MEM;
            else
            {
                // first convert color_mode in the bigger precision
#ifdef IM_PROCESS
                ret = imProcessConvertColorSpace(src_image, temp_image);
#else
                ret = imConvertColorSpace(src_image, temp_image);
#endif
                if (ret == IM_ERR_NONE)
                {
                    // second just convert data type
#ifdef IM_PROCESS
                    ret = imProcessConvertDataType(temp_image, dst_image, cpx2real, gamma, absolute, cast_mode);
#else
                    ret = imConvertDataType(temp_image, dst_image, cpx2real, gamma, absolute, cast_mode);
#endif
                }
                imImageDestroy(temp_image);
            }
        }
    }

#ifdef IM_PROCESS
    imProcessCounterEnd(counter);
#else
    imCounterEnd(counter);
#endif

    return ret;
}