Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion.

Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules.

 

Go Back   Doom9's Forum > Capturing and Editing Video > Avisynth Usage

Reply
 
Thread Tools Search this Thread Display Modes
Old 9th June 2010, 08:58   #1  |  Link
*.mp4 guy
Registered User
 
*.mp4 guy's Avatar
 
Join Date: Feb 2004
Posts: 1,350
New Sharpening Function

Examples : 4x nnedi2, 4x nnedi2 New Sharpening, 4x nnedi2 limitedsharpenfaster smode4, 4x nnedi2 ssssharp.
Edit:Additional examples added, as requested.

After reading this post by Didée I decided to
take a crack at the problem of sharpening an interpolated or lowpassed image. Out of curiosity I tried the resulting function
on a few difficult to sharpen non-interpolated sources (GITS R1 Special eddition, etc.), and it did very well (imo, of course).
So here is a new, general sharpening function. Right now its named "blah". Because naming things is difficult, and naming it
after what it is actually doing would require a paragraph long function call.

Code:
Function blah(Clip c, Int "str", int "strv", int "strh", float "de", float "dev", float "deh", float "re", float "rev", float "reh", float "cstr", float "cstrv", float "cstrh")
{# A sharpening function, Version 0.0

	str = Default(Str, 4)
		strv = Default(strv, str)
		strh = Default(strh, str)
	de = Default(de, 0.2)
		dev = Default(dev, de)
		deh = Default(deh, de)
	re = Default(re, de/2)
		rev = Default(rev, re)
		reh = Default(reh, re)
	cstr = Default(cstr, 0.5)
	cstrv = Default(cstrv, cstr)
	cstrh = Default(cstrh, cstr)

	de = 20/de
		dev = 20/dev
		deh = 20/deh
	re = 20/re
		rev = 20/rev
		reh = 20/reh

	thrc = 72
		thrcv = thrc
		thrcH = thrc				
			thr2gv = 1/sqrt(thrcv)
			thr2gh = 1/sqrt(thrch)
	
	
	lp_V = C.NLLV_Variant4()
		Diff_V = mt_makediff(C, lp_V)

	lp_H = lp_V.NLLH_Variant4()
		Diff_H = mt_makediff(lp_V, lp_H)
			dev_ = string(rev)
			deh_ = string(reh)
			DeEmphasis = lp_H.yahr.yahr.Mt_Convolution(Horizontal=" 1 6 15 "+deh_+" 15 6 1 ", vertical =" 1 6 15 "+dev_+" 15 6 1 ", u=1, v=1)

	STRV_ = string(strv)
	Max_V = mt_luts( C, C, mode = "max", pixels = " 1 0 -1 0 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRV_+" 1 >= "+STRV_+" 0.5 ^ "+STRV_+" ? + / - 128 +", u=1, v=1)
	Min_V = mt_luts( C, C, mode = "min", pixels = " 1 0 -1 0 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRV_+" 1 >= "+STRV_+" 0.5 ^ "+STRV_+" ? + / - 128 +", u=1, v=1)
		MinMax_High_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
		MinMax_Low_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
			minmax_UL_V = mt_lutXY( MinMax_Low_V, MinMax_High_V, expr = "x y x - -", u=1, v=1)
				minmax_G_V = Average(MinMax_High_V, 0.1, MinMax_Low_V, 0.35, minmax_UL_V, 0.275, minmax_UL_V, 0.275)
	STRH_ = string(strh)
	Max_H = mt_luts( C, C, mode = "max", pixels = " 0 1 0 -1 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRH_+" 1 >= "+STRH_+" 0.5 ^ "+STRH_+" ? + / - 128 +", u=1, v=1)
	Min_H = mt_luts( C, C, mode = "min", pixels = " 0 1 0 -1 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRH_+" 1 >= "+STRH_+" 0.5 ^ "+STRH_+" ? + / - 128 +", u=1, v=1)
		MinMax_High_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
		MinMax_Low_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
			minmax_UL_H = mt_lutXY( MinMax_Low_H, MinMax_High_H, expr = "x y x - -" )
				minmax_G_H = Average(MinMax_High_H, 0.1, MinMax_Low_H, 0.35, minmax_UL_H, 0.275, minmax_UL_H, 0.275)


	Diff_V = mt_lutXY( Diff_V, minmax_G_V, expr = " x 128 - y 1 > y 1 ? * y x 128 - abs - 1 > y x 128 - abs - 1 ? / 128 +  ", u=1, v=1)
	Diff_H = mt_lutXY( Diff_H, minmax_G_H, expr = " x 128 - y 1 > y 1 ? * y x 128 - abs - 1 > y x 128 - abs - 1 ? / 128 +  ", u=1, v=1)
		Diff_HV = mt_adddiff(Diff_H, Diff_V)
			HPSharp = mt_adddiff(DeEmphasis, Diff_HV)
				rev_ = string(rev)
				reh_ = string(reh)
				ReEmphasis = HPSharp.Mt_Convolution(Horizontal=" 1 6 15 -"+reh_+" 15 6 1 ", vertical =" 1 6 15 -"+rev_+" 15 6 1 ", u=1, v=1)

	thrcv_ = string(thrcv)
		V = MT_Luts(ReEmphasis, ReEmphasis, mode="med", pixels = " 0 0 0 1 0 -1 0 2 0 -2 " ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrcv_+" 1 >= "+thrcv_+" 0.5 ^ "+thrcv_+" ? + / - 128 +", u=1,v=1).mt_Lut("X 128 - abs", u=1, v=1)
	thrch_ = string(thrch)
		H = MT_Luts(ReEmphasis, ReEmphasis, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 " ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrch_+" 1 >= "+thrch_+" 0.5 ^ "+thrch_+" ? + / - 128 +", u=1,v=1).mt_Lut("X 128 - abs", u=1, v=1)


	Gauss_V = mt_Makediff(ReEmphasis, ReEmphasis.Mt_Convolution(Horizontal=" 1 ", vertical =" 1 6 15 20 15 6 1 ", u=1, v=1))
		thr2gv_ = string(thr2gv)
		cstrv_ = string(cstrv)
		Gauss_V = mt_lutXY( Gauss_V, V, expr = " x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + ", u=1, v=1)
	Gauss_H = mt_Makediff(ReEmphasis, ReEmphasis.Mt_Convolution(Horizontal=" 1 6 15 20 15 6 1 ", vertical =" 1 ", u=1, v=1))
		thr2gh_ = string(thr2gh)
		cstrh_ = string(cstrh)
		Gauss_H = mt_lutXY(Gauss_H, H, expr = " x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + ", u=1, v=1)
			Gauss_VH = mt_adddiff(Gauss_V, Gauss_H)
				contrast = mt_adddiff(ReEmphasis, Gauss_VH)
				
Return(mergechroma(contrast, C, 1))
}


Required Functions:
Code:
Function blurH(clip c, int "rad", Float "CW")
{
	
	Rad = Default(rad, 1)
	CW = Default(CW, 0.5)
	
	Center = C
	Left = C.PointResize(C.width, C.height, -rad, 0, C.width, C.height)
	Right = C.PointResize(C.width, C.height, rad, 0, C.width, C.height)
	
	Average(Center, CW/2, Left, (1-CW)/2, Right, (1-CW)/2, Center, CW/2)
	
Return(last)
}

Function BlurV(clip c, int "rad", Float "CW")
{
	
	Rad = Default(rad, 1)
	CW = Default(CW, 0.5)
	
	Center = C
	Down = C.PointResize(C.width, C.height, 0, -rad, C.width, C.height)
	Up = C.PointResize(C.width, C.height, 0, rad, C.width, C.height)
	
	Average(Center, CW/2, Down, (1-CW)/2, Up, (1-CW)/2, Center, CW/2)
	
Return(last)
}

Function NLLH_Variant4(Clip C, int "rad")
{


	Rad = Default(Rad, 1)

	B1 = C.BlurH(1*rad, 0.439)
	B2 = C.BlurH(2*rad, 0.833)
	B3 = C.BlurH(3*rad, 0.934)
	B4= C.BlurH(4*rad, 0.983)

		B1_D = Mt_Makediff(B1, C, u=1, v=1)
		B2_D = Mt_MakeDiff(C, B2, u=1, v=1)
		B3_D = Mt_MakeDiff(B3, C, u=1, v=1)
		B4_D = Mt_MakeDiff(C, B4, u=1, v=1)

			B2_DT = Mt_LutXY(B1_D, B2_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 1.915 * X 128 - abs - 0 > \
			Y 128 - abs 1.915 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
			B3_DT = Mt_LutXY(B2_DT, B3_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.025 * X 128 - abs - 0 > \
			Y 128 - abs 2.025 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
			B4_DT = Mt_LutXY(B3_DT, B4_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.077 * X 128 - abs - 0 > \
			Y 128 - abs 2.077 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
	Mt_AddDiff(B4_DT, C)
	
	

Return(last)
}

Function NLLV_Variant4(Clip C, int "rad")
{


	Rad = Default(Rad, 1)

	B1 = C.BlurV(1*rad, 0.439)
	B2 = C.BlurV(2*rad, 0.833)
	B3 = C.BlurV(3*rad, 0.934)
	B4= C.BlurV(4*rad, 0.983)

		B1_D = Mt_Makediff(B1, C, u=1, v=1)
		B2_D = Mt_MakeDiff(C, B2, u=1, v=1)
		B3_D = Mt_MakeDiff(B3, C, u=1, v=1)
		B4_D = Mt_MakeDiff(C, B4, u=1, v=1)

			B2_DT = Mt_LutXY(B1_D, B2_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 1.915 * X 128 - abs - 0 > \
			Y 128 - abs 1.915 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
			B3_DT = Mt_LutXY(B2_DT, B3_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.025 * X 128 - abs - 0 > \
			Y 128 - abs 2.025 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
			B4_DT = Mt_LutXY(B3_DT, B4_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.077 * X 128 - abs - 0 > \
			Y 128 - abs 2.077 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
	Mt_AddDiff(B4_DT, C)
	
	

Return(last)
}

# Y'et A'nother H'alo R'educing script

function YAHR(clip clp)
{
b1    = clp.minblur(2).removegrain(11,-1)
b1D   = mt_makediff(clp,b1)
w1    = clp.aWarpSharp(depth=32,blurlevel=2,thresh=0.5)
w1b1  = w1.minblur(2,1).removegrain(11,-1)
w1b1D = mt_makediff(w1,w1b1)
DD    = b1D.repair(w1b1D,13) 
DD2   = mt_makediff(b1D,DD)
clp.mt_makediff(DD2,U=2,V=2)
}

 function MinBlur(clip clp, int r, int "uv")
 {
 uv   = default(uv,3)
 uv2  = (uv==2) ? 1 : uv
 rg4  = (uv==3) ? 4 : -1
 rg11 = (uv==3) ? 11 : -1
 rg20 = (uv==3) ? 20 : -1
 medf = (uv==3) ? 1 : -200
 
 RG11D = (r==1) ? mt_makediff(clp,clp.removegrain(11,rg11),U=uv2,V=uv2)
  \    : (r==2) ? mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20),U=uv2,V=uv2)
  \    :          mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20).removegrain(20,rg20),U=uv2,V=uv2)
 RG4D  = (r==1) ? mt_makediff(clp,clp.removegrain(4,rg4),U=uv2,V=uv2)
  \    : (r==2) ? mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
  \    :          mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
 DD    = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
 clp.mt_makediff(DD,U=uv,V=uv)
 return(last)
}

Required plugins: Mt_Masktools, Average, Removegrain, aWarpSharp, Medianblur and Repair.

Defaults are intended for strong sharpening on 2x upscaled material. For normal sharpening, set de to 0.02, str to 3 and cstr
to 0.75 and go from there. The failure modes are as graceful as I can reasonably get them, considering the strength of the
sharpening required. Also, the degree of sharpening that can be "gotten away with" varies pretty wildly by source.

parameters:

str = strength of highpass sharpening default 4
strv = vertical version of str defaults to str
strh = horizontal version of str defaults to str

de = de-emphasis strength default 0.2
dev = vertical version of de defaults to de
deh = horizontal version of de defaults to de

re = re-emphasis strength defaults to de/2
rev = vertical version of re defaults to re
reh = horizontal version of re defaults to re

cstr = strength of contrast sharpening default 1, values above 1 will cause halos
cstrv = vertical version of cstr defaults to cstr
cstrh = horizontal version of cstr defaults to cstr

edit: thanks to Archimedes and Gavino for spotting two mistakes, both should now be fixed.
edit2: Changed non-linear lowpass function, new one should be generally more consistent

Last edited by *.mp4 guy; 10th June 2010 at 23:47.
*.mp4 guy is offline   Reply With Quote
Old 9th June 2010, 14:21   #2  |  Link
rkalwaitis
Robert
 
Join Date: Jan 2008
Location: Stuttgart
Posts: 407
Medianblur function?
rkalwaitis is offline   Reply With Quote
Old 9th June 2010, 15:03   #3  |  Link
Archimedes
Registered User
 
Join Date: Apr 2005
Posts: 210
Requirements should be:
Code:
LoadPlugin("plugins\Average\src\Release\Average.dll")
LoadPlugin("plugins\aWarpSharp\aWarpSharp.dll")
LoadPlugin("plugins\MaskTools 2\mt_masktools.dll")
LoadPlugin("plugins\MedianBlur\medianblur.dll")
LoadPlugin("plugins\RemoveGrain 1.0\RemoveGrain.dll")
LoadPlugin("plugins\RemoveGrain 1.0\Repair.dll")
Archimedes is offline   Reply With Quote
Old 9th June 2010, 15:39   #4  |  Link
Gser
Registered User
 
Join Date: Apr 2008
Posts: 302
How about adding LSFmod and SSSharpen to the comparison?
Gser is offline   Reply With Quote
Old 9th June 2010, 15:57   #5  |  Link
Gavino
Avisynth language lover
 
Join Date: Dec 2007
Location: Spain
Posts: 3,374
Quote:
Originally Posted by *.mp4 guy View Post
Code:
		strv = Default(Str, 4)
		strh = Default(Str, 4)
There's an obvious bug there; any values explicitly supplied for strv and strh are ignored and str used in their place. Should be
Code:
		strv = Default(strv, str)
		strh = Default(strh, str)
Gavino is offline   Reply With Quote
Old 10th June 2010, 00:43   #6  |  Link
foxyshadis
ангел смерти
 
foxyshadis's Avatar
 
Join Date: Nov 2004
Location: Lost
Posts: 9,175
I always like your style, mp4 guy. Keep throwing luts at the problem, pare it down to what works, figure out why and use that to start the process again. I'll give this a shot tonight, though I have a feeling it's not going to work in realtime at all.
__________________
There are four boxes to be used in defense of liberty: soap, ballot, jury, and ammo. Please use in that order. ~ Ed Howdershelt
foxyshadis is offline   Reply With Quote
Old 10th June 2010, 23:43   #7  |  Link
*.mp4 guy
Registered User
 
*.mp4 guy's Avatar
 
Join Date: Feb 2004
Posts: 1,350
Examples from GITS

Code:
MPEG2Source("K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", cpu=0, info=3).colormatrix(hints=true).crop(8, 16, -8, -16)
clip2=yadif()#mcbob.selecteven
TFM(slow=2, clip2=clip2, d2v="K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", pp=7)
tdecimate()

Code:
MPEG2Source("K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", cpu=0, info=3).colormatrix(hints=true).crop(8, 16, -8, -16)
clip2=yadif()#mcbob.selecteven
TFM(slow=2, clip2=clip2, d2v="K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", pp=7)
tdecimate()

Mt_Convolution(Horizontal=" 1 6 15 -112 15 6 1 ", vertical =" 1 ", u=2, v=2)#horizontal unsharpmask

limitedsharpenfaster(smode=4, strength=100)

Code:
MPEG2Source("K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", cpu=0, info=3).colormatrix(hints=true).crop(8, 16, -8, -16)
clip2=yadif()#mcbob.selecteven
TFM(slow=2, clip2=clip2, d2v="K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", pp=7)
tdecimate()

Mt_Convolution(Horizontal=" 1 6 15 -112 15 6 1 ", vertical =" 1 ", u=2, v=2)#horizontal unsharpmask

sssharp(denoise=0)

Code:
MPEG2Source("K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", cpu=0, info=3).colormatrix(hints=true).crop(8, 16, -8, -16)
clip2=yadif()#mcbob.selecteven
TFM(slow=2, clip2=clip2, d2v="K:\GITS_D1\VIDEO_TS\VTS_01_1.d2v", pp=7)
tdecimate()

Mt_Convolution(Horizontal=" 1 6 15 -112 15 6 1 ", vertical =" 1 ", u=2, v=2)#horizontal unsharpmask

blah(de=0.2, deh=0.025, rev=0.025, str=3, strh=12, cstrv=0.66, cstrh=1)


Aster some testing I've switched out the non linear lowpass with a different variant (updated in first post). Also, If blah doesn't work for you guys, tell me now so I can see if its tunable, or if its just too fiddly to get good results. If you just don't like what it does, that's fine too. Basically what I want to know is if its usable for anyone else.

Quote:
Originally Posted by foxyshadis View Post
I'll give this a shot tonight, though I have a feeling it's not going to work in realtime at all.
I was thinking about calling it epochsharpen, but I think its actually turned out faster then sssharp. It really pays to avoid that 4x supersampling, especially in RAM usage.

Last edited by *.mp4 guy; 11th June 2010 at 00:12. Reason: clarity
*.mp4 guy is offline   Reply With Quote
Old 16th June 2010, 00:58   #8  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
To my eyes blah has less haloing at the expense of less texture in relation to lsf and sssharp.
markanini is offline   Reply With Quote
Old 16th June 2010, 03:22   #9  |  Link
*.mp4 guy
Registered User
 
*.mp4 guy's Avatar
 
Join Date: Feb 2004
Posts: 1,350
Quote:
Originally Posted by markanini View Post
To my eyes blah has less haloing at the expense of less texture in relation to lsf and sssharp.
When it sharpens texture it usually does it better imo, but it is less likely to sharpen texture then sssharp, and to an extent, lsf as well. However, I almost always prefer non-sharpened texture when doing upscaling as compared to what sssharp and lsf can do, so for me it is an all around improvement. The reduction in haloing is not directly linked to the difference in texture sharpening. It's possible to get similar texture sharpening from the underlying mechanisms, without halos, but its bad for other reasons.

Edit: Here is a question in return.

Is the reduction in sharpening strength good or bad in your opinion?

Last edited by *.mp4 guy; 16th June 2010 at 06:34.
*.mp4 guy is offline   Reply With Quote
Old 16th June 2010, 21:18   #10  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
I mostly use sharpening in avsynth on upscaled still images via FritzPhoto, much like the examples you posted.
I found the lack of texture was a let down to be honest. Also it seem to overemphasize speckle like features and "stray pixels". But then it's remarkably immune to halos so I'll keep my eye on any developments.
markanini is offline   Reply With Quote
Old 18th June 2010, 10:26   #11  |  Link
*.mp4 guy
Registered User
 
*.mp4 guy's Avatar
 
Join Date: Feb 2004
Posts: 1,350
Alright, new spin off function. Pretty much just a general purpose sharpener now, but imo better then medsharp or sssharp. Also, better name then blah.


Code:
Function ReCon(clip c, float "str", float "strv", float "strh", float "rad", float "radh", float "radv", int "lmode", int "thresh")
{#Reconvolution - makes things sharp by mixing pixels together

	str = Default(str, 4)
		strv = Default(strv, str)
		strh = Default(strh, str)

	Rad = Default(Rad, 2)
		Radv = Default(Radv, Rad)
		Radh = Default(Radh, Rad)

	lmode = Default(lmode, 1)
	
	thresh = Default(thresh, 720)


	thrc = thresh
		thrcv = thrc
		thrcH = thrc				
			thr2gv = 1/sqrt(thrcv)
			thr2gh = 1/sqrt(thrch)
	str_ = thresh
		strv_ =str_
		strh_ = str_		
		
		thrm = thresh
					
	thrm_ = string(thrm)
	Max_V = Radv == 0.5 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : C
	Max_V = Radv == 1 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	Max_V = Radv == 1.5 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	Max_V = Radv == 2 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	Max_V = Radv == 2.5 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	Max_V = Radv == 3 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	Max_V = Radv == 4 ? mt_luts( C, C, mode = "max", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_V
	
	Min_V = Radv == 0.5 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : C
	Min_V = Radv == 1 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V
	Min_V = Radv == 1.5 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V
	Min_V = Radv == 2 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V
	Min_V = Radv == 2.5 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V
	Min_V = Radv == 3 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V
	Min_V = Radv == 4 ? mt_luts( C, C, mode = "min", pixels = "0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_V

	thrcv_ = string(thrcv)
	Med_V = Radv == 0.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : C
	Med_V = Radv == 1 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Radv == 1.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2 0 3 0 -3" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Radv == 2 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Radv == 2.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Radv == 3 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Radv == 4 ? MT_Luts(C, C, mode="med", pixels = "0 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_V
	Med_V = Med_V.mt_Lut("X 128 - abs", u=1, v=1)
	
		MinMax_High_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
		MinMax_Low_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
			minmax_UL_V = mt_lutXY( MinMax_Low_V, MinMax_High_V, expr = "x y x - -", u=1, v=1)
				minmaxmed_v = Average(MinMax_High_V, 0.0625, MinMax_Low_V, 0.25, minmax_UL_V, 0.34375, Med_V, 0.34375)
	
	STRH_ = string(strh_)
	Max_H = Radh == 0.5 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : C
	Max_H = Radh == 1 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	Max_H = Radh == 1.5 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	Max_H = Radh == 2 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	Max_H = Radh == 2.5 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	Max_H = Radh == 3 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	Max_H = Radh == 4 ? mt_luts( C, C, mode = "max", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Max_H
	
	Min_H = Radh == 0.5 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : C
	Min_H = Radh == 1 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
	Min_H = Radh == 1.5 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
	Min_H = Radh == 2 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
	Min_H = Radh == 2.5 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
	Min_H = Radh == 3 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
	Min_H = Radh == 4 ? mt_luts( C, C, mode = "min", pixels = "1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8 0", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1, v=1) : Min_H
		
	thrch_ = string(thrch)
	Med_H = Radh == 0.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : C
	Med_H = Radh == 1 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Radh == 1.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Radh == 2 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Radh == 2.5 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Radh == 3 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Radh == 4 ? MT_Luts(C, C, mode="med", pixels = "0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 6 0 -6 0 7 0 -7 0 8 0 -8 0" ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrm_+" 1 >= "+thrm_+" 0.5 ^ "+thrm_+" ? + / - 128 +", u=1,v=1) : Med_H
	Med_H = Med_H.mt_Lut("X 128 - abs", u=1, v=1)

		MinMax_High_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
		MinMax_Low_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
			minmax_UL_H = mt_lutXY( MinMax_Low_H, MinMax_High_H, expr = "x y x - -" )
				minmaxmed_h = Average(MinMax_High_h, 0.0625, MinMax_Low_h, 0.25, minmax_UL_h, 0.34375, Med_h, 0.34375)
	
							
																			
	Blur_V = C.NLLV_variant4()
	Blur_V = Rad > 1 ? Blur_V.NLLV_variant4(2) : Blur_V
	Blur_V = Rad > 2 ? Blur_V.NLLV_variant4(3) : Blur_V
	Blur_V = Rad > 3 ? Blur_V.NLLV_variant4(4) : Blur_V
		Sharp_Diff_V = mt_Makediff(C, Blur_V)

		thr2gv_ = string(thr2gv)
		cstrv_ = string(strv)
		Sharp_V = lmode == 0 ? mt_lutXY(Sharp_Diff_V, minmaxmed_v, expr = " x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + ", u=1, v=1) : C
		Sharp_V = lmode == 1 ? mt_lutXY(Sharp_Diff_V, minmaxmed_v, expr = " x 128 - abs y > x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + X 128 - y 0.5 ^ * "+thr2gv_+" 0.5 ^ * "+cstrv_+" * 128 + ? ", u=1, v=1) : Sharp_V
		Sharp_V = lmode == 2 ? mt_lutXY(Sharp_Diff_V, minmaxmed_v, expr = " x 128 - abs y > x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + Y 0 > X 128 - "+cstrv_+" * 128 + 128 ? ? ", u=1, v=1) : Sharp_V
		Sharp_V = lmode == 3 ? mt_lutXY(Sharp_Diff_V, minmaxmed_v, expr = " x 128 - abs y > x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + X 128 - "+cstrv_+" * 128 + ? ", u=1, v=1) : Sharp_V
		Sharp_V = lmode == 4 ? mt_lutXY(Sharp_Diff_V, minmaxmed_v, expr = " x 128 - "+cstrv_+" * 128 + ", u=1, v=1) : Sharp_V
	
	Blur_H = C.NLLH_variant4()
	Blur_H = Rad > 1 ? Blur_H.NLLH_variant4(2) : Blur_H
	Blur_H = Rad > 2 ? Blur_H.NLLH_variant4(3) : Blur_H
	Blur_H = Rad > 3 ? Blur_H.NLLH_variant4(4) : Blur_H
		Sharp_Diff_H = mt_Makediff(C, Blur_H)

		thr2gh_ = string(thr2gh)
		cstrh_ = string(strh)
		Sharp_H = lmode == 0 ? mt_lutXY(Sharp_Diff_H, minmaxmed_h, expr = " x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + ", u=1, v=1) : C
		Sharp_H = lmode == 1 ? mt_lutXY(Sharp_Diff_H, minmaxmed_h, expr = " x 128 - abs y > x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + X 128 - y 0.5 ^ * "+thr2gh_+" 0.5 ^ * "+cstrh_+" * 128 + ? ", u=1, v=1) : Sharp_H
		Sharp_H = lmode == 2 ? mt_lutXY(Sharp_Diff_H, minmaxmed_h, expr = " x 128 - abs y > x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + Y 0 > X 128 - "+cstrh_+" * 128 + 128 ? ? ", u=1, v=1) : Sharp_H	
		Sharp_H = lmode == 3 ? mt_lutXY(Sharp_Diff_H, minmaxmed_h, expr = " x 128 - abs y > x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + X 128 - "+cstrh_+" * 128 + ? ", u=1, v=1) : Sharp_H
		Sharp_H = lmode == 4 ? mt_lutXY(Sharp_Diff_H, minmaxmed_h, expr = " x 128 - "+cstrh_+" * 128 + ", u=1, v=1) : Sharp_H
		
			Sharp_VH = mt_adddiff(Sharp_V, Sharp_H)
				sharpened = mt_adddiff(C, Sharp_VH)
sharpened.mergechroma(C, 1)

Return(last)
}
Same depdendencies as blah, minus yahr and minblur related stuff.

Rad - radius of sharpening
str - strength
lmode - limit mode, 0 strong limiting, 3 minimal limiting. Default 1.

Also, I'm curious if rad 4 ever works better then rad 3.

update: added lmode 4

Last edited by *.mp4 guy; 20th June 2010 at 07:35.
*.mp4 guy is offline   Reply With Quote
Old 18th June 2010, 11:14   #12  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
Hmm, no function named NLLV_variant4. What am I missing?
NEVERMIND: Missed the 'required functions' in OP.

Last edited by markanini; 18th June 2010 at 11:17.
markanini is offline   Reply With Quote
Old 19th June 2010, 17:17   #13  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
Been testing Recon on a few web sized digicam and camera phone photos and I'm finding results are really pleasant and settings are simple and intuitive. I can see my self reachng for ReCon for most photos now. I'll still use lsfmod and sssharp for difficult sources and maximizing texture respectively. ReCon is in my eye the better general purpose sharpener now. Hats off for you *.mp4 guy!
markanini is offline   Reply With Quote
Old 20th June 2010, 06:42   #14  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
I tested ReCon on a highly defocused digicam photo.

Scaled down to 1/6th for speedy processing and levels tweaked with smoothlevels:



With ReCon I settled on str=3, rad=28, lmode=2:
markanini is offline   Reply With Quote
Old 20th June 2010, 07:33   #15  |  Link
*.mp4 guy
Registered User
 
*.mp4 guy's Avatar
 
Join Date: Feb 2004
Posts: 1,350
Using a radius above 4 is not supported. If a radius above 4 is selected, mask generation is disabled (clip c is used instead). Radii above 4 are not supported because they become unusably slow, and the limiting method breaks down.

In this case, the blur is too much, and the limiting fails. In light of this I have added an unlimited mode, lmode=4, as upon further testing, the sharpening kernel performs better then unsharp masking on this source.

try theses settings with the updated version:
ReCon(rad=4, str=3, lmode=4)

Also, let me restate, rads that are not equal to 0.5, 1, 1.5, 2, 2.5, 3 or 4 do not function properly.

Last edited by *.mp4 guy; 20th June 2010 at 07:36.
*.mp4 guy is offline   Reply With Quote
Old 22nd June 2010, 07:32   #16  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293
I like the lmode range in the updated version !
I tried the blurry butterfly photo wih the new version was ab improvement. But I'm guessing you'd have to downscale that image further for a 4 pixel radius to fit....
Rather than talking about my special case I want to report that ReCon seems susceptible to alising in some sources, more so than lsfmod and sssharp.

Last edited by markanini; 22nd June 2010 at 07:58.
markanini is offline   Reply With Quote
Old 22nd June 2010, 07:56   #17  |  Link
markanini
Registered User
 
Join Date: Apr 2006
Posts: 293


Notice how transitions beteen white spots look cleaner in updated version.
markanini is offline   Reply With Quote
Old 22nd June 2010, 14:53   #18  |  Link
Archimedes
Registered User
 
Join Date: Apr 2005
Posts: 210
Quote:
Originally Posted by markanini View Post
Rather than talking about my special case I want to report that ReCon seems susceptible to alising in some sources, more so than lsfmod and sssharp.
Seems, supersampling is needed. Normally, I don't like the results, when supersampling was used beforehand on normal sharpening tasks. That's why I prefer SSSharp(ssw=False) or SeeSaw for normal sharpening tasks (even with stronger settings you don't need any supersampling). But that's a question of personal taste.

However, on such blurred sources, antialiasing with supersampling afterwards (e. g. with NNEDI2) is not bad at all (if supersampling beforehand isn't a choice).

ReCon(rad=4, str=4, lmode=4) >>
ReCon(rad=4, str=4, lmode=4) + NNEDI2 + Spline36Resize >>

Last edited by Archimedes; 22nd June 2010 at 14:58.
Archimedes is offline   Reply With Quote
Old 22nd June 2010, 15:41   #19  |  Link
Didée
Registered User
 
Join Date: Apr 2002
Location: Germany
Posts: 5,390
Quote:
Originally Posted by Archimedes View Post
Normally, I don't like the results, when supersampling was used beforehand on normal sharpening tasks.
There's always the possibility to perform supersampling without affecting the basic source by the supersampling process. It's not even much more difficult.

Instead of

source -> upsize -> filter -> downsize


one would do

1) source -> upsize -> filter
2) get difference(upsize,filtered)
3) source.apply(difference.downsize)

This way, the supersampling process affects only (well, mostly) the difference of the filter, not the source material in itself.
__________________
- We´re at the beginning of the end of mankind´s childhood -

My little flickr gallery. (Yes indeed, I do have hobbies other than digital video!)
Didée is offline   Reply With Quote
Old 22nd June 2010, 16:53   #20  |  Link
Archimedes
Registered User
 
Join Date: Apr 2005
Posts: 210
Things can be so easy. That will minimize the blur causing by the interpolation (up- and downscaling), indeed. But that's not the fly in the ointment (© http://www.leo.org). It's much more the "difference.downsize" which I dislike in combination with normal sharpening.
Archimedes is offline   Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 01:58.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2017, vBulletin Solutions Inc.