# Visual superposition of two images

In a previous question Karsten 7. proposed an elegant image-manipulation solution on how to overlay two images.

However in the following case the method does not properly work and needs refinement. Let me be more specific:

An image of real galaxy

And here is an image of a numerical simulation

As you can see, there is a problem with the first image. More precisely, the entire galaxy is slightly titled to the right.

Is there a way to fit the numerical simulation image on top of the real galaxy? The green and red arms should be rotated, stretched, moved and whatever is necessary, so as to fit exactly to the arms of the real galaxy.

The output should be something similar like this

Any suggestions?

• @Kuba The problem is not mathematical! I simply want to fit the second image on top of the first. Aug 17, 2016 at 16:19
• @Kuba You are right! The entire galaxy is titled. Anyway, the simulation image should somehow be manipulated, so as the green and the red arms to fit exactly the real ones. Aug 17, 2016 at 16:29
• @Vaggelis_Z: "The problem is not mathematical! I simply want to fit the ..." Fitting is inherently a mathematical process, so I would consider this question far too vague as is. What would qualify as a good fit? What kind of transformation will you allow to which image in order to make the fit work? Can I just rearrange all the pixels int he second image to make the fit, or do you want it limited to stretching/rotation/scaling?
– nben
Aug 17, 2016 at 17:16
• @Vaggelis_Z Your edit doesn't answers any of my questions; it just plops different numerical data on a better initial galaxy image. This code will combine your two images if you have them loaded as img1 and img2: ImageAdd[img1, ImageApply[If[Min[#] > 0.5, {0, 0, 0, 0}, Append[#, 1]] &, img2]], but that particular fit looks awful to me. Is it good enough for you? If not, why not, and how should I evaluate whether a particular alignment of the images is 'good enough'? If you just want to overlay them by eye, I'd suggest using photoshop or the gimp.
– nben
Aug 17, 2016 at 17:27
• @Vaggelis_Z Unless you can formally define what you mean by "so as to fit the real arms" then Mathematica is probably the wrong tool for this. It sounds like you want to drag/stretch/rotate the simulation image to obtain a subjective alignment with the galaxy image (ie, you'll know it when you see it, but you can't describe the criteria formally); photoshop is great for this. If what you want is to find the affine transform of the second image that minimizes the sum of distances from all green/red pixels to the nearest white pixel, or something like that, Mathematica is a better tool.
– nben
Aug 17, 2016 at 17:48

I think it might work to just add rotation to Karsten 7.'s previous answer that was cited in the question.

simulation =
With[{sim = Import["https://i.stack.imgur.com/3xNli.jpg"]},
ColorReplace[sim, First @ DominantColors@sim -> Transparent]]

galaxy = Import["https://i.stack.imgur.com/qDYpd.jpg"]


### Update

DynamicModule[{galaxyW, galaxyH},
{galaxyW, galaxyH} = ImageDimensions[galaxy];
Manipulate[
ImageCompose[
galaxy,
ImageRotate[ImageResize[simulation, {s1, s2}], θ °], Scaled[{p1, p2}]],
{{p1, 0.5}, 0.2, 1., Appearance -> "Labeled"},
{{p2, 0.5}, 0.2, 1., Appearance -> "Labeled"},
{{s1, galaxyW/2}, 100, 50 + galaxyW, Appearance -> "Labeled"},
{{s2, galaxyH/2}, 100, 20 + galaxyH, Appearance -> "Labeled"},
{{θ, 0.}, -90., 90., 2. , Appearance -> "Labeled"}]]


The adjusted image and its parameters can be saved by choosing Paste Snapshot from the Manipulate's Autorun/Bookmark popup menu.

DynamicModule[{p1 = 0.5, p2 = 0.51, s1 = 535., s2 = 192.4, θ = -20.},
ImageCompose[
galaxy,
ImageRotate[ImageResize[simulation, {s1, s2}], θ °], Scaled[{p1, p2}]]]


• The output is simply great! Could you provide the exact values of p1, p2, s1, s2 and $\theta$ which you used for obtaining this result? Aug 18, 2016 at 5:37
• @Vaggelis_Z. I have made an update that shows how to save the adjusted image and its parameters. Aug 18, 2016 at 14:35
• Yes, everything is great now. Many thanks! Aug 18, 2016 at 14:44

Assuming this is just about making them visually match in an interactive way:

i1 = Import["https://i.stack.imgur.com/qDYpd.jpg"];
i2 = Import["https://i.stack.imgur.com/3xNli.jpg"];
i2 = ColorReplace[i2, First@DominantColors@i2 -> Transparent]
i3 = Image3D[{i2}];

Manipulate[
Show[{i3}, Prolog -> Inset[i1, shift], Background -> Black],
{{shift, {0.5, 0.5}}, {0.3, 0.3}, {0.7, 0.7}}]


The Manipulate is only used to shift the galaxy a little bit. The simulation image can be rotated and resized with the mouse directly.

• Is there a way to remove the white bounding box? Aug 18, 2016 at 10:07
• @Vaggelis_Z Yes, just add the option Boxed -> False to Show. Aug 18, 2016 at 13:08

Assuming that all you really want/need is a visually good fit, you can apply the functions Translate, Rotate, and Scale to any Mathematica graphics of your simulated result, and then superimpose the two graphics using Show`. If you wrap this into a manipulate environment, you can even adapt your simulation result interactively for a best visual fit. Looking up the documentation of the above three functions should be sufficient to get you started.

• This is not an answer, it's just a comment. Answers provide the full solution to the problem. Aug 17, 2016 at 18:46
• @Vaggelis_Z I don't think the answer is particularly helpful either, but your question is so vague and unspecified that I don't think you can expect anything better than rough guidance like this. I'm flagging your question because I think that demanding that others post exact solutions to very-particular and not especially Mathematica-relevant problems for you, then down-voting them when they instead post help/guidance about the general case, borders on abuse of the forum; this is a learning and dialog site, not a do-your-homework-for-you site.
– nben
Aug 17, 2016 at 19:09
• @user21382: I agree, which is why I posted what I posted.
– Pirx
Aug 17, 2016 at 19:35
• @Vaggelis_Z: Thanks for your appreciation; I will keep this in mind for the future.
– Pirx
Aug 17, 2016 at 19:36