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[
Image@Rasterize[
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["https://i.stack.imgur.com/ezIpy.jpg"];
image2 = Import["https://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]
]
Images:
ImageCorrespondingPoints
orImageAlign
? They are likely to be much faster. $\endgroup$