denoise_TVL1
import { denoise_TVL1 } from '@banou/opencv-wasm'Use after await initOpenCV(). See the initialization and named imports guide.
Primal-dual algorithm is an algorithm for solving special types of variational problems (that is, finding a function to minimize some functional). As the image denoising, in particular, may be seen as the variational problem, primal-dual algorithm then can be used to perform denoising and this is exactly what is implemented.
It should be noted, that this implementation was taken from the July 2013 blog entry [MA13] , which also contained (slightly more general) ready-to-use source code on Python. Subsequently, that code was rewritten on C++ with the usage of openCV by Vadim Pisarevsky at the end of July 2013 and finally it was slightly adapted by later authors.
Although the thorough discussion and justification of the algorithm involved may be found in
[ChambolleEtAl], it might make sense to skim over it here, following [MA13] . To begin
with, we consider the 1-byte gray-level images as the functions from the rectangular domain of
pixels (it may be seen as set
\left\{(x,y)\in\mathbb{N}\times\mathbb{N}\mid 1\leq x\leq n,\;1\leq y\leq m\right\} for some
m,\;n\in\mathbb{N}) into \{0,1,\dots,255\}. We shall denote the noised images as f_i and with
this view, given some image x of the same size, we may measure how bad it is by the formula
\left\|\left\|\nabla x\right\|\right\| + \lambda\sum_i\left\|\left\|x-f_i\right\|\right\|
\|\|\cdot\|\| here denotes L_2-norm and as you see, the first addend states that we want our
image to be smooth (ideally, having zero gradient, thus being constant) and the second states that
we want our result to be close to the observations we've got. If we treat x as a function, this is
exactly the functional what we seek to minimize and here the Primal-Dual algorithm comes into play.
denoise_TVL1(observations: MatVector, result: Mat, lambda: number, niters: number): void;3 available overloads
denoise_TVL1(observations: MatVector, result: Mat): void;denoise_TVL1(observations: MatVector, result: Mat, lambda: number): void;denoise_TVL1(observations: MatVector, result: Mat, lambda: number, niters: number): void;observationsThis array should contain one or more noised versions of the image that is to be restored.
resultHere the denoised image will be stored. There is no need to do pre-allocation of storage space, as it will be automatically allocated, if necessary.
lambdaCorresponds to
\lambdain the formulas above. As it is enlarged, the smooth (blurred) images are treated more favorably than detailed (but maybe more noised) ones. Roughly speaking, as it becomes smaller, the result will be more blur but more sever outliers will be removed.nitersNumber of iterations that the algorithm will run. Of course, as more iterations as better, but it is hard to quantitatively refine this statement, so just use the default and increase it if the results are poor.
These signatures describe this package. Upstream documentation can mention optional backends that are absent from this build. Check runtime compatibility before choosing a backend or file format.