Log in

View Full Version : ungibbs, a gibbs artifact remover


*.mp4 guy
6th February 2008, 03:16
function blurfunction2(clip c){
c
dctlimit(dct2=1.625, dct3=0, dct4=0, dct5=0, dct6=0, dct7=0, dct8=0, use64dct=false, use32dct=false, use8dct=true, use4dct=false)
}

function ungibbs(clip c){
thresh = 224

c
predict = c.blurfunction2
sharp1 = c.limitedsharpenfaster(smode=4, strength=100, overshoot=0)#Xsharpen(31, 255)
blur1 = c.removegrain(4)
sharp2 = c.limitedsharpenfaster(smode=3, strength=100, overshoot=0)
blur2 = c.quantile(2)
blur3 = c.spline36resize(width*2, height*2).removegrain(4).spline36resize(c.width, c.height)

bp0 = mt_makediff(predict, c)
bp1 = mt_makediff(sharp1.blurfunction2, c)
bp2 = mt_makediff(blur1.blurfunction2, c)
bp3 = mt_makediff(sharp2.blurfunction2, c)
bp4 = mt_makediff(blur2.blurfunction2, c)
bp5 = mt_makediff(blur3.blurfunction2, c)

cp1 = mt_merge(c, sharp1, MT_lutxy(bp0, bp1, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m100 = mt_makediff(c, cp1.blurfunction2, u=1, v=1)

cp2 = mt_merge(cp1, blur1, MT_lutxy(m100, bp2, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m101 = mt_makediff(c, cp2.blurfunction2, u=1, v=1)

cp3 = mt_merge(cp2, sharp2, MT_lutxy(m101, bp3, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m102 = mt_makediff(c, cp3.blurfunction2, u=1, v=1)

cp4 = mt_merge(cp3, blur2, MT_lutxy(m102, bp4, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m103 = mt_makediff(c, cp4.blurfunction2, u=1, v=1)

cp5 = mt_merge(cp4, blur3, MT_lutxy(m103, bp5, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m104 = mt_makediff(c, cp5.blurfunction, u=1, v=1)

#cp6 = mt_merge(cp5, blur3, MT_lutxy(m100, bp2, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1))
#m105 = mt_makediff(c, cp2.blurfunction, u=1, v=1)


cp5}

Requires: limitedsharpenfaster, removegrain, removegrain HD, masktools 2, dctlimit. [edit] forgot to list frfun7.

This is here (development as opposed to usage) because, its slow, it causes artifacts sometimes, and because I am lazy and don't want to spend all of my time explaining how to make it work.

example script:#source
ungibbs().ungibbs()
spline36resize(1280, 720)
Note that it will probably produce very ugly results if used on a source that is not, atleast, a little blurry.

example: processed (http://img221.imageshack.us/img221/4523/ex03tk6.jpg), unprocessed (http://img527.imageshack.us/img527/7771/ex04id1.jpg)

ankurs
7th February 2008, 12:54
L's nose seems a bit darker :p is that the effect of artefacts of being removed , did'nt get it to tell the truth , nice work thouh , will have to look into it , seems interesting :p

*.mp4 guy
7th February 2008, 15:52
L's nose seems a bit darker :p is that the effect of artefacts of being removed , did'nt get it to tell the truth , nice work thouh , will have to look into it , seems interesting :p

The line(s) are darker because of the selective sharpening, via LSF, which is necessary to balance out the bluring. If no sharpening is used, the picture looks too soft/flat, even though the ringing removal is good at avoiding bluring lines.

ankurs
7th February 2008, 16:48
The line(s) are darker because of the selective sharpening, via LSF, which is necessary to balance out the bluring. If no sharpening is used, the picture looks too soft/flat, even though the ringing removal is good at avoiding bluring lines.

yh i get you on that . temporal denoiser by didee/sagekilla is almost of the same perspective though , still have to test this , no time as of yet , will surely put in my contribution n test the thing out n probably also will compare em ( time n speeds ) and post the results :devil:.. nice concept though :)

Wilbert
14th June 2015, 17:25
I was looking at a good deringing filter but i couldn't find any (guess the footage from the phone is just crap with ringing all over the place). So i was trying yours:

cp5 = mt_merge(cp4, blur3, MT_lutxy(m103, bp5, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1).frfun7(0.51, 256, 256))
m104 = mt_makediff(c, cp5.blurfunction, u=1, v=1)

#cp6 = mt_merge(cp5, blur3, MT_lutxy(m100, bp2, "x 128 - abs y 128 - abs - "+string(thresh)+" *", u=1, v=1))
#m105 = mt_makediff(c, cp2.blurfunction, u=1, v=1)

blurfunction should be blurfunction2 i guess?

I see that yours removes some deringing. Which parameters do i need to tune to make it much stronger?

feisty2
14th June 2015, 17:33
RemoveGrain mode 24 is designed specifically for ringing removal

feisty2
14th June 2015, 17:45
And nlmeans could do a cool dering if you just favor something other than removegrain
Here, knlmeanscl (d=0,a=24,s=0,h=7.2), greater "h"=stronger dering

Overdrive80
16th June 2015, 23:15
That server of images is a crap.

*.mp4 guy
18th June 2015, 06:30
That server of images is a crap.
There were fewer good image hosts back then. Also, some of the ones which are bad now used to be better. That said, I quite agree with you that it isn't very good.

General Information:

There are a lot of things that get lumped in as ringing, this particular filter was intended for use on the stuff that shows up on analog captures, that is why it has a lowpass filter derived blur function. The blur function is used to estimate how to treat various areas of the image, it is not ever applied to the output directly.

@Wilbert

blurfunction is probably a dependency I forgot to post (and no one used the function, so I never caught it). Replacing it with blurfunction2 should work acceptably. As far as strength goes, you just have to run it multiple times, it is an extremely brute force method, but at the time it was much better than anything else on the material it was written for.

If you care to post a sample of some kind I could probably dig up something much faster with similar or perhaps better quality. One of the main problems is that you really need to know what you're doing to set up deringing filters properly, which is why I haven't posted any besides this - they are too difficult to use and there is very little interest.

Blankmedia
26th October 2021, 19:37
Hi, is this still a good way to remove Gibb's Noise? I can't find the DCTlimit pluggin and I don't know what it does. Thank you?

StainlessS
26th October 2021, 23:51
I can't find the DCTlimit pluggin

https://forum.doom9.org/showthread.php?p=953353#post953353

EDIT: And you'll need DctFilter:- http://avisynth.nl/index.php/External_filters#Spatial_Denoisers

Blankmedia
30th October 2021, 06:58
Well thank you!

Blankmedia
2nd November 2021, 19:24
https://forum.doom9.org/showthread.php?p=953353#post953353

EDIT: And you'll need DctFilter:- http://avisynth.nl/index.php/External_filters#Spatial_Denoisers

Well well well, dctfilter doesn't take offx and offy anymore and I don't know enough to make it works.

But thanks for sending me these!

Edit: I still don't know shit

But to make it work (i.e. stop giving me errors) in blurfunction 2 I changed

dctlimit(dct2=1.625[...]) for dctlimit(dct2=0.0625[...])

I picked 0.0625 because it seemed to be a recurring number in these functions.

In dfilter I reactivated the c.pointresize line while removing offx and offy in dctfilter and I pounded the c.dctfilter line.

function dfilter(clip c, int offx, int offy, float dc, float dct2, float dct3, float dct4, float dct5, float dct6, float dct7, float dct8) {
c.PointResize(c.width,c.height,offx,offy,c.width,c.height).dctfilter(dc,dct2,dct3,dct4,dct5,dct6,dct7,dct8,chroma=0).PointResize(c.width,c.height,-offx,-offy,c.width,c.height)
# c.dctfilter(dc,dct2,dct3,dct4,dct5,dct6,dct7,dct8,chroma=0)
}

Blankmedia
2nd November 2021, 20:07
Well with the changes I made it doesn't give me good results.

But this one here (https://forum.doom9.org/showthread.php?p=1726753#post1726753) seems to work for my needs. I put mode 27 instead of 17 because it's supposed to retain thin edges better.

### Gibbs Noise Block ###
function GibbsNoiseBlock( clip IN )
{
Edge=MT_Edge( IN, "prewitt", ThY1=20, ThY2=40).RemoveGrain(27) # RemoveGrain(17)
Mask=MT_Logic( Edge.MT_Expand().MT_Expand().MT_Expand().MT_Expand(),Edge.MT_Inflate().MT_Inpand(),"xor").Blur(1.0)
MT_Merge( IN, Minblur( IN ), Mask, Luma = True)
}

Egit: I don't know where I read that about mode 27, maybe I confused it with mode 26 that preserves corners but not thin lines.