aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-05-05 11:54:02 +0200
committerPaul B Mahol <onemda@gmail.com>2022-05-05 19:06:08 +0200
commit003f9a9b41d62280ffd107d6e51e20c1745bccd6 (patch)
treed12c0dc8ee22233a96359e940a03f0620b094530
parent0914e3a14ae6a8b61af72abd90f9caca5053b9c1 (diff)
downloadffmpeg-003f9a9b41d62280ffd107d6e51e20c1745bccd6.tar.gz
avfilter/vf_fftdnoiz: add alternative denoising method
-rw-r--r--doc/filters.texi3
-rw-r--r--libavfilter/vf_fftdnoiz.c18
2 files changed, 20 insertions, 1 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index 478a75bd3a..b21bd198ec 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -12347,6 +12347,9 @@ Set size of block in pixels, Default is 32, can be 8 to 256.
@item overlap
Set block overlap. Default is 0.5. Allowed range is from 0.2 to 0.8.
+@item method
+Set denoising method. Default is @code{wiener}, can also be @code{hard}.
+
@item prev
Set number of previous frames to use for denoising. By default is set to 0.
diff --git a/libavfilter/vf_fftdnoiz.c b/libavfilter/vf_fftdnoiz.c
index 6ae194a360..f22b3dbb54 100644
--- a/libavfilter/vf_fftdnoiz.c
+++ b/libavfilter/vf_fftdnoiz.c
@@ -55,6 +55,7 @@ typedef struct FFTdnoizContext {
float amount;
int block_size;
float overlap;
+ int method;
int nb_prev;
int nb_next;
int planesf;
@@ -85,6 +86,12 @@ static const AVOption fftdnoiz_options[] = {
OFFSET(block_size), AV_OPT_TYPE_INT, {.i64=32}, 8, 256, .flags = FLAGS },
{ "overlap", "set block overlap",
OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0.2, 0.8, .flags = FLAGS },
+ { "method", "set method of denoising",
+ OFFSET(method), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, .flags = TFLAGS, "method" },
+ { "wiener", "wiener method",
+ 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, .flags = TFLAGS, "method" },
+ { "hard", "hard thresholding",
+ 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, .flags = TFLAGS, "method" },
{ "prev", "set number of previous frames for temporal denoising",
OFFSET(nb_prev), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, .flags = FLAGS },
{ "next", "set number of next frames for temporal denoising",
@@ -495,6 +502,7 @@ static void filter_plane2d(FFTdnoizContext *s, int plane,
const int block = p->b;
const int nox = p->nox;
const int noy = p->noy;
+ const int method = s->method;
const int buffer_linesize = p->buffer_linesize / sizeof(float);
const float depthx = (1 << (s->depth - 8)) * (1 << (s->depth - 8));
const float sigma = s->sigma * depthx / (s->block_size * s->block_size);
@@ -514,7 +522,15 @@ static void filter_plane2d(FFTdnoizContext *s, int plane,
re = buff[j * 2 ];
im = buff[j * 2 + 1];
power = re * re + im * im;
- factor = fmaxf(limit, (power - sigma) / (power + 1e-15f));
+ switch (method) {
+ case 0:
+ factor = fmaxf(limit, (power - sigma) / (power + 1e-15f));
+ break;
+ case 1:
+ factor = power < sigma ? limit : 1.f;
+ break;
+ }
+
buff[j * 2 ] *= factor;
buff[j * 2 + 1] *= factor;
}