[FFmpeg-devel] [PATCH] avfilter/vf_nlmeans: add parameter to control weight of centered pixel
Paul B Mahol
onemda at gmail.com
Fri May 11 20:49:45 EEST 2018
Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
libavfilter/vf_nlmeans.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/libavfilter/vf_nlmeans.c b/libavfilter/vf_nlmeans.c
index 82e779ce85..872fa90e28 100644
--- a/libavfilter/vf_nlmeans.c
+++ b/libavfilter/vf_nlmeans.c
@@ -52,6 +52,7 @@ typedef struct NLMeansContext {
int chroma_w, chroma_h;
double pdiff_scale; // invert of the filtering parameter (sigma*10) squared
double sigma; // denoising strength
+ float amount; // amount of denoising
int patch_size, patch_hsize; // patch size and half size
int patch_size_uv, patch_hsize_uv; // patch size and half size for chroma planes
int research_size, research_hsize; // research size and half size
@@ -76,6 +77,7 @@ static const AVOption nlmeans_options[] = {
{ "pc", "patch size for chroma planes", OFFSET(patch_size_uv), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 99, FLAGS },
{ "r", "research window", OFFSET(research_size), AV_OPT_TYPE_INT, { .i64 = 7*2+1 }, 0, 99, FLAGS },
{ "rc", "research window for chroma planes", OFFSET(research_size_uv), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 99, FLAGS },
+ { "a", "denoising amount", OFFSET(amount), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.01, 1.0, FLAGS },
{ NULL }
};
@@ -415,15 +417,15 @@ static int nlmeans_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs
static void weight_averages(uint8_t *dst, ptrdiff_t dst_linesize,
const uint8_t *src, ptrdiff_t src_linesize,
struct weighted_avg *wa, ptrdiff_t wa_linesize,
- int w, int h)
+ int w, int h, float amount)
{
int x, y;
for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) {
// Also weight the centered pixel
- wa[x].total_weight += 1.f;
- wa[x].sum += 1.f * src[x];
+ wa[x].total_weight += amount;
+ wa[x].sum += amount * src[x];
dst[x] = av_clip_uint8(wa[x].sum / wa[x].total_weight);
}
dst += dst_linesize;
@@ -470,7 +472,7 @@ static int nlmeans_plane(AVFilterContext *ctx, int w, int h, int p, int r,
}
weight_averages(dst, dst_linesize, src, src_linesize,
- s->wa, s->wa_linesize, w, h);
+ s->wa, s->wa_linesize, w, h, 1.f / s->amount);
return 0;
}
--
2.11.0
More information about the ffmpeg-devel
mailing list