I'm trying to register (align) two circular grayscale images using a boolean mask to prevent them simply being aligned on the fixed circular border. There are also small fixed circular regions in the image that cause further problems (image artifacts, black dot marks).

In the Mathematica documentation (https://reference.wolfram.com/mathematica/ref/ImageCorrelate.html) there is a simple example for image correlation with a circular mask.

Here is an example image:


Here is the code I put together using ImageCorrelate, I want to use this, except for larger images then are in the example:

(*note this mask isn't complete*)
mask = ColorConvert[
     Graphics[{{White, Disk[{0, 0}, 700]}, {Black, 
        Disk[{70, -20}, 60]}}, 
      PlotRange -> {{-800, 800}, {-800, 800}}, Background -> Black], 
     ImageSize -> 500, RasterSize -> 500], "GrayScale"];

pos = Position[Flatten[ImageData@mask], 1.];
f = NormalizedSquaredEuclideanDistance[Extract[#1, pos], Extract[#2, pos]]&;

image1 = Import["http://i.stack.imgur.com/ezIpy.jpg"];
image2 = Import["http://i.stack.imgur.com/1YVXh.jpg"];

(*this takes forever...*)
corr = ImageCorrelate[image1, image2, f];
minOffset = PixelValuePositions[corr, Min[ImageData[corr]]][[1]] - ImageDimensions[image1]/2;

How can I make this more efficient such that it can be used on larger images?

I've tried to make my own compiled version of NormalizedSquaredEuclideanDistance, however I haven't been able to figure out how to deal with arbitrary length vectors...

Some code borrowed from: Image correlation

To follow up on @bills comment, I did try ImageCorrespondingPoints and ImageAlign, however, they often find matching points on the static boundary as corresponding points which would prevent accurate alignment. I couldn't figure out how to implement some sort of boolean mask. Cropping a square (code below) from the center of the image helped the situation but the black spots still cause problems.

cropper[image_] := ImageAdjust[ImageCrop[image, 1000]];

alignerKey[image1_, image2_] := Module[{cropped1, cropped2, transform},
  transform = FindGeometricTransform[cropper@image1, cropper@image2, "Transformation" -> "Translation"];
  ImagePerspectiveTransformation[image2, Last@transform, DataRange -> Full]


image1 image2

  • $\begingroup$ What exactly do you want to identify here? Are you trying to match the circles in the two images to each other? (It might be clear to other people but I'm confused) $\endgroup$ – Vincent Tjeng Mar 2 '14 at 22:52
  • $\begingroup$ @VincentTjeng I'm trying to align (register) the two images. $\endgroup$ – s0rce Mar 2 '14 at 23:56
  • 1
    $\begingroup$ Did you try ImageCorrespondingPoints or ImageAlign? They are likely to be much faster. $\endgroup$ – bill s Mar 3 '14 at 0:04
  • 1
    $\begingroup$ Error (429) This account's public links are generating too much traffic and have been temporarily disabled! There's no way to download your images $\endgroup$ – Dr. belisarius Aug 20 '15 at 6:58
  • 5
    $\begingroup$ I'm voting to close this question as off-topic because the OP used an image server that doesn't allow access to the files. So it is not possible to test the code and/or design a new one $\endgroup$ – Dr. belisarius Feb 7 '16 at 23:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.