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

2018-12-12 Thread uwe . freese

Hello Kyle,

You should also try vf_removelogo. It is supposedly better than the
more simple vf_delogo.


I tried (with a box in a PNG mask as logo cover).

That is no alternative both quality wise and from usability point of view:

1. It gave me blurry borders with several pixels widths from outside to 
the inner. They were very symmetrical and showed a 45 degree "lines" 
from the edges to the middle. Hardly the nice blurred box I wanted.


2. If you want to cover the logo by simple coordinates (a box), it's 
unnecessary effort to create a PNG mask with that box in it instead of 
giving the coordinates as parameter.



Because removelogo can handle arbitrary masks and the calculation I 
posted is using a simple rectangular box (and this is my typical use 
case), I suggested to add it to the "delogo" filter.


So my offer stands, would be nice if someone can add this additional mode.


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@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Thanks,
Kyle
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


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

2018-12-12 Thread Kyle Swanson
Hi,

On 12/11/18, uwe.fre...@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@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

Thanks,
Kyle
__