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); }
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 }
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 }
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; }