[FFmpeg-devel] Add alternative delogo algorithm for my donation

Kyle Swanson k at ylo.ph
Thu Dec 13 00:45:30 EET 2018


Hi,

On 12/11/18, uwe.freese at gmx.de <uwe.freese at gmx.de> wrote:
> 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.

You should also try vf_removelogo. It is supposedly better than the
more simple vf_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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

Thanks,
Kyle


More information about the ffmpeg-devel mailing list