[FFmpeg-devel] Add alternative delogo algorithm for my donation
uwe.freese at gmx.de
uwe.freese at gmx.de
Tue Dec 11 22:08:18 EET 2018
Hello,
I would like that the delogo filter is improved by an alternative way of
removing the logo. It's the "UGLARM" mode known from Virtual Dub's
DeLogo filter and ffdshow.
I used it many years (under Windows), but now moving to Linux miss it
using ffmpeg as encoding tool.
Since an ffmpeg developer can probably add the code in a fragment of the
time and more consistently than it would take me to add it, I'd like to
hire someone to do so.
The code is just ~50 lines, and already available in c for ffdshow. I'd
donate 50 EUR (PayPal) for someone adding it - hopefully into the normal
production code for everyone to use. :)
So if someone knows the delogo code / filter code and volunteers, let me
know. :) I would be really glad if this could be done.
++ How does it work:
The algorith is called "UGLARM mode" and takes all pixels of the 1-pixel
border of the box covering the logo into account to interpolate the
inner pixels. Each pixel is taken into account according to an
exponential value of the distance. The result is a more blurred and I
find much more pleasing effect than the current xy-algorithm in
ffmpgeg's delogo filter, which tends to show vertical and horizontal
lines / crosses. Although the calculation takes more time than the
xy-interpolation, this is absolutely not relevant compared to the video
encoding time.
The code was impemented by myself ~15 years ago for the VirtualDub
filter "LogoAway" by Chris Wojdon. It was taken over in the ffdshow
Codec package for Windows.
"UGLARM" stands for "Uwe's Great LogoAway Remove Mode". :-) It was my
not-so-serious answer to Chris about how we could name it. But the name
was taken over in his filter and later ffdshow, where it's available
until now.
++ How does it look:
See these examples:
http://www.fixya.com/support/r3995122-remove_logo_from_avi_mpg4_file_using
https://forum.videohelp.com/threads/260207-Remove-Spoilers-Logos-etc
(search for "UGLARM" for the image).
++ Code to add:
I alreday took a look at the ffmpeg code and ffdshow code.
In ffdshow, you can find the functions in TimgFilterLogoaway.cpp:
https://sourceforge.net/p/ffdshow-tryout/code/HEAD/tree/trunk/src/imgFilters/TimgFilterLogoaway.cpp
In ffmpeg, it has to be added in libavfilter/vf_delogo.c, function
apply_delogo.
Here's the relevant code to add (+ some config variable to set the mode
I guess):
// Precalculate weights once.
void TimgFilterLogoaway::Tplane::calcUweWeightTable(int w, int h, int power)
{
double e = 1.0 + (0.3 * power);
int x;
for (x = 0; x < w; x++)
for (int y = 0; y < h; y++)
if (x + y != 0) {
double d = pow(sqrt(double(x * x + y * y)), e);
uwetable[x + y * w] = 1.0 / d;
} else {
uwetable[x + y * w] = 1.0;
}
for (x = 1; x < w - 1; x++)
for (int y = 1; y < h - 1; y++) {
double weightsum = 0;
for (int bx = 0; bx < w; bx++) {
weightsum += uwetable[abs(bx - x) + y * w];
weightsum += uwetable[abs(bx - x) + abs(h - 1 - y) * w];
}
for (int by = 1; by < h - 1; by++) {
weightsum += uwetable[x + abs(by - y) * w];
weightsum += uwetable[abs(w - 1 - x) + abs(by - y) * w];
}
uweweightsum[y * w + x] = weightsum;
}
}
// apply filter
void TimgFilterLogoaway::Tplane::uwe(const TlogoawaySettings *cfg)
{
if (!uwetable) {
uwetable = (double*)aligned_malloc(w * h * sizeof(double));
uweweightsum = (double*)aligned_malloc(w * h * sizeof(double));
calcUweWeightTable(w, h, cfg->blur);
}
for (int x = 1; x < w - 1; x++)
for (int y = 1; y < h - 1; y++) {
double r = 0;
const unsigned char *lineN = bordn, *lineS = bords;
for (int bx = 0; bx < w; bx++) {
r += lineN[bx] * uwetable[abs(bx - x) + y * w];
r += lineS[bx] * uwetable[abs(bx - x) + abs(h - 1 - y)
* w];
}
const unsigned char *lineW = bordw, *lineE = borde;
for (int by = 1; by < h - 1; by++) {
r += lineW[by] * uwetable[x + abs(by - y) * w];
r += lineE[by] * uwetable[abs(w - 1 - x) + abs(by - y)
* w];
}
logotempdata[y * logotempstride + x] = uint8_t(r /
uweweightsum[y * w + x]);
}
}
Regards,
Uwe
More information about the ffmpeg-devel
mailing list