Video noise is random and not correlated in time. I assume, the best method is using wavelet denoise in this case, right? If yes, how is wavelet denoise implemented for video? Is there something to consider in order to apply the calculation to the whole image sequence?
-
$\begingroup$ I feel like temporal coherence could be used to denoise video as well. $\endgroup$– Alan WolfeCommented Sep 1, 2015 at 16:17
-
$\begingroup$ Why do you think Wavelet based Denoising would be best? $\endgroup$– RoyiCommented Feb 23, 2016 at 7:04
-
$\begingroup$ @poor, What make you think that (Not that I think the other way, I'm just wondering)? $\endgroup$– RoyiCommented Feb 24, 2016 at 6:42
-
$\begingroup$ @Drazick I've read this somewhere 2-3 years ago. Not sure, but I guess it's probably a mixture of different algorithms for different situations. May I ask why you are interested in this? Is there any better approach? Note: I'm not a physicist. However I'm using denoisers for video very frequently and I'm just curious how they work :) Also see: dsp.stackexchange.com/questions/20086/… $\endgroup$– p2orCommented Feb 24, 2016 at 12:26
-
$\begingroup$ I would also guess Wavelets, but here - ni.neatvideo.com/overview/how-does-it-work the imply something else. Regarding the approach, I'm not sure, Non Local Means should also be good but harder to tune and slower to run. $\endgroup$– RoyiCommented Feb 25, 2016 at 6:56
3 Answers
Elaboration on temporal solve:
I don't have much concrete info for you, but I'm drawing from the idea of "temporal anti aliasing".
Basically, if a camera was stationary, you could average pixel values over the last N frames, possibly using harmonic mean or something else like that to help filter out spikes. The result would be a cleaner, less noisy, more correct image.
But not all cameras (or objects!) are stationary, so what then? Well, if you have some way of identifying where a pixel this frame matches a pixel on the previous N frames, you could average them in the same way. If a current pixel has no matching previous pixel (due to something previously occluding becoming visible) you just show the raw current value.
Games use this for antialiasing by simulating super sampling over time, but they have the benefit of per pixel motion vectors as well as the current and previous camera matrix, so it's a lot harder in your situation!
A fairly basic but effective technique is median filtering. For video, you can apply it (spatio)temporally by replacing the value of each pixel in each frame by the median of the values of the pixel (and its neighbors) in the current and the N previous and later frames.
A nice feature of median filtering is that it preserves linear edges (and, when used temporally, edges that move at a steady rate). It does, however, tend to erode sharp corners and narrow ridges (and, temporally, narrow fast-moving features). When overused, spatial median filtering has a tendency to create an over-smooth "plastic" appearance, while excessive temporal median filtering can even make small, fast-moving objects disappear completely. (Sometimes this is considered a feature.)
It's possible to fine-tune and improve median filtering further with advanced techniques like motion tracking and threshold detection, but those also introduce an extra layer of complexity, and thus extra opportunities for unwanted artifacts if applied carelessly. For many purposes, a simple median filter of moderate size and strength is often all you really need.
In 2009 it seems there was a development of an hierarchical and comparison motion detection algorithm that was proposed in this paper:
Motion detection: fast and robust algorithms for embedded systems
They managed to get a decent reduction of noise, as you can see in the last image of the paper. It seems it's the "morphological post-processing" that removes stand-alone pixels (section 2.4 New hierarchical algorithm). Perhaps a similar technique can be applied to denoise the video.