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 imProcessFillHoles(const imImage* image, imImage* NewImage, int connect) { // finding regions in the inverted image will isolate only the holes. imProcessNegative(image, NewImage); imImage *region_image = imImageCreate(image->width, image->height, IM_GRAY, IM_USHORT); if (!region_image) return; int holes_count = imAnalyzeFindRegions(NewImage, region_image, connect, 0); if (!holes_count) { imImageCopy(image, NewImage); imImageDestroy(region_image); return; } imushort* region_data = (imushort*)region_image->data[0]; imbyte* dst_data = (imbyte*)NewImage->data[0]; for (int i = 0; i < image->count; i++) { if (*region_data) *dst_data = 1; else *dst_data = !(*dst_data); // Fix negative data. region_data++; dst_data++; } imImageDestroy(region_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 }
/*****************************************************************************\ image:Copy() \*****************************************************************************/ static int imluaImageCopy (lua_State *L) { imImage* src_image = imlua_checkimage(L, 1); imImage* dst_image = imlua_checkimage(L, 2); imlua_match(L, src_image, dst_image); imImageCopy(src_image, dst_image); return 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 }
void imProcessIFFT(const imImage* src_image, imImage* dst_image) { imImageCopy(src_image, dst_image); imProcessFFTraw(dst_image, 1, 1, 2); // inverse, uncentered, double normalized }