I'll start by saying that Jupiter is not hiding; Jupiter does not really need to be found. If Jupiter is above the horizon it's fairly likely to be the first thing you'd see if you looked at the brightest objects in the sky. But it's still an interesting object to try to process and I get to employ a few new tools on it here. I should also point out that there are more objects moving in the frames below than just Jupiter. I will point out at least one more in another analysis.
1. These are the 'original' unaligned frames from two different nights: 5/1/2019 and 5/28/2019. I put original in quotes because there's a little more processing going on here. These frames are actually median integrated stacks of registered frames from multiple closely spaced observations on those dates. Note that one of the frames is dimmer than the other.
2. We could probably stop here as Jupiter's motion is utterly apparent already, but there are other useful things to point out. These aligned frames have two new image processing techniques applied to them that will likely greatly improve the results of other, more subtle, investigations. First, I've applied PSF deconvolution to sharpen and reveal fainter sources. Second, I've implemented a brightness matching algorithm of my own devising (applied to the dimmer frame) to minimize the brightness differences when comparing frames.
3. These are the difference frames with linked moving objects. The image difference is computed as the individual frames in image set 2 subtracted from a static sky template generated from an integration (a pixel-wise minimum in this 2 frame instance) of the frames of image set 2. My method of template generation has also evolved and the template now entirely clips (and thus masks in the difference) the brightest sources as I'm not looking for changes in those source's brightness but rather the existence or non existence of a source.
4. Linked object motion translated back to the aligned frames of image set 2. That's Jupiter.
5. Here's another one of my visual proofs. Jupiter is circled and I've highlighted two features that you can find in Stellarium.
6. Stellarium's position for Jupiter on 5/1/2019 with the corresponding reference features from image set 5.
The processing of Jupiter generally follows from the process for Uranus, but there are a number noteworthy and useful additions. Few if any of these techniques were required to detect Jupiter, but I'm trying to pull another moving object out of these observations and these new techniques were really helpful for that.
- Stacked input images: Instead of working individual images on a single night, I registered and integrated multiple images over one night to create a super frame with less noise.
- PSF Deconvolution: This is standard practice, but I didn't really need to do it for any prior analysis I've done. I didn't need it for Jupiter either, but I'm going to be doing it regardless from now on.
- Registration non-overlapping region mask: It was lazy to not do this before now. I just masked the empty space that is produced when you register multiple images to a reference image. This way you're not differencing images against non-overlapping spaces.
- Brightness matching: Because images from different nights can look different based on ambient lightning and seeing, I tried to create a tool that would minimize the RMS brightness difference via a two step process. I'll write more about this later, but it seemed to work really well for this analysis.
- Template image clipping: I don't care about differences in source brightness, so I started thresholding and clipping the template image to make sure that any bright source is fully removed when differenced against a frame. Less bright regions of the template are still preserved as intermediate values, but bright stationary sources are effectively masked with this process even if their brightness varies. Here's what a static sky template looks like.
- Small object removal: I was using median filtering to attempt to remove salt and pepper type noise, but scikit-image has a really useful function called remove_small_objects() that does what it says. You can basically specify the maximum size of contiguous pixels you want to preserve and it will remove all objects smaller than that. It's great for removing noise and preserving bigger blocks of signal.
- I have at least one more moving object to extract from these frames.
- I still need to write up a generalized process document. I promise I will get to that soon.