View Full Version : Zebra v1.20,Test/Diagnostic clip generator. 02 Oct 2019.
StainlessS
12th April 2013, 22:28
Zebra. Promted by this thread:
http://forum.doom9.org/showthread.php?t=167591
Requires VS2008 Runtimes.
Zebra() v1.20
# Avisynth v2.5(x86) / v2.6 x86 and x64 Plugins by StainlessS : http://forum.doom9.org/showthread.php?t=167663&highlight=Zebra
Zebra(clip c, Float "Threshold"=0.0,int "matrix"=(c.width>1100 || c.height>600)?3:2,
\ bool "Row"=true,int "lo"=128,int "hi"=255,int "cmad"=1,int "pix"=48
\ Float "MinTh"=threshold, Float "MaxTh"=threshold,Float "MnMx_MinTh"=threshold,Float "MnMx_MaxTh"=threshold,Int "FuncMap"=$FF,
\ Int "MskFunc"=4,Float "MskLoTh"=0.0,Float MskHiTh"=127.5,Int "MskInColY"=0,Int "MskOutColY"=255
\ )
Creates an (up to) 8 band clip in two modes,
"Row"=True, creates a set of 8 bands "pix" pixels wide (default 48) per band and same height & colorspace as source clip.
Each horizontal pixel row in the bands represents the contents of the horizontal rows of the source clip.
"Row"=False, creates a set of 8 bands "pix" pixels tall (default 48) per band and same width & colorspace as source clip.
Each vertical pixel column in the bands represents the contents of the vertical columns of the source clip.
The 8 bands it creates are (from left to right if Row==true and top to bottom if Row==false)
0 ) YPlaneMin (0->255)
1 ) YPlaneMax (0->255)
2 ) YPlaneMinMaxDifference (0->255)
3 ) YPlaneMedian (0->255)
4 ) AverageLuma (rounded to nearest int, range 0 -> 255)
5 ) YInRange (population of pixels in range lo to hi, scaled 0->255 and rounded to nearest int [255.0 == 100%])
6 ) YPlaneStdev Luma Standard Deviation.
7 ) MskByRow(MskFunc=4) : where MskFunc is one of the previous bands numbers above, 0->6, default 4=AverageLuma.
FuncMap, Default $FF (dec 255), ie 8 bits set, selects all 8 bands.
Bit 0, ($01), YPlaneMin(Threshold=MinTh)
Bit 1, ($02), YPlaneMax(Threshold=MaxTh)
Bit 2, ($04), YPlaneMinMaxDifference(MnMx_MinTh, MnMx_MaxTh) # MinMaxDif band has individually selectable thresholds
Bit 3, ($08), YPlaneMedian
Bit 4, ($10), AverageLuma
Bit 5, ($20), YInRange(lo=Lo,hi=Hi)
Bit 6, ($40), YPlaneStdev()
Bit 7, ($80), MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY)
"Threshold" is group threshold setting used for bands 0, 1, and 2 as for eg YPlaneMin, 0.0->100.0%, Avoids extreme pixels, ie noise.
"lo" and "hi", set pixel range for YInRange band.
"Matrix",(For RGB -> Luma-Y conversion, not used in YUV modes), Default is 3 if width>1100 or c.height > 600 else 2
0) = rec601
1) = rec709
2) = PC601
3) = PC709
MinTh Default Threshold, is threshold for YPlaneMin band 0.
MaxTh Default Threshold, is threshold for YPlaneMax band 1.
MnMx_MinTh Default Threshold, is minimum threshold for YPlaneMinMaxDifference, band 2. (individual thresholds for both min and max)
MnMx_MaxTh Default Threshold, is maximum threshold for YPlaneMinMaxDifference, band 2.
You might use eg YPlaneMin(MinTh=0.1) to ignore (at most) darkest 0.1% of pixels when finding minimum pixel luma.
YplaneMax(MaxTh=0.2), ignores lightest (at most) 0.2% of pixels.
YplaneMinMaxDifference(MnMx_MinTh=0.3, MnMx_MaxTh=0.4), ignores darkest 0.3% and lightest0.4% of pixels.
YPlaneMedian, is essentially YPlaneMin(Threshold=50.0).
Bit 7, MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY) [ Bit 7 MskByRow Added in v1.20 for Zebra function ONLY]
MskFunc, 0->6, default 4(AverageLuma). The Band to create mask from.
MskLoTh,MskHiTh, 0.0 <= MskLoTh <= MskHiTh <= 255.0. MskLoTh default 0.0, MskHiTh default 127.5.
MskInColY, 0->255, Output color of band row/column if selected MskFunc band value is between MskLoTh and MskHiTh.
MskOutColY, 0->255, Output color of band row/column if selected MskFunc band value is NOT between MskLoTh and MskHiTh.
Any MskFunc function thresholds etc use those already defined. eg "MinTh" is threshold for YPlaneMin band 0 when MskFunc=0(YPlaneMin).
"CMad", Centered Moving Averages Diameter, 1->100, default = 1 (OFF). Each row or column of pixels in the bands are averaged with neighbours
within the "cmad" diameter. A "cmad" of eg 13 would average each row/column with 6 neighbours on either side (plus itself = 13).
Setting "cmad" greater than 1 will produce smoother, bands due to the averaging.
You can set an Even CMad where eg CMad=2 would average current pixel and half of the two pixel values either side of it.
"Pix", size of bands in pixels 4->64, default 48 (Mod 4 Only).
You can of course just select a single band, or crop it out, and maybe PointResize if required (horizontally if Row=True, vertically if Row=False, to match eg source frame size).
############################################
Zebroid(clip c, Float "threshold"=0.0,int "matrix"=(c.width>1100 || c.height>600)?3:2,
\ int "lo"=128,int "hi"=255,int "cmad"=1,int "func"=4,
\ Float "MinTh"=threshold, Float "MaxTh"=threshold,Float "MnMx_MinTh"=threshold,Float "MnMx_MaxTh"=threshold,Int "funcMap"=$10,
\ int "lo2"=lo,int "hi2"=hi,int "cmad2"=cmad,int "func2"=func,
\ Float "MinTh2"=MinTh, Float "MaxTh2"=MaxTh,Float "MnMx_MinTh2"=MnMx_MinTh,Float "MnMx_MaxTh2"=MnMx_MaxTh,Int "funcMap2"=funcMap
\ )
v1.10, added args, lo2, hi2, cmad2, func2, MinTh2, MaxTh2, MnMx_MinTh2, MnMx_MaxTh2, funcMap2, which optionally specify alteratives
for equivalent of Zebra(Row=False) (horizontal bars).
NOTE, can specify single Zebroid function using eg Func=4,=AverageLuma band or using FuncMap=$10(AverageLuma again), cannot simultaneously
specify both Func and FuncMap else throws an error. Using FuncMap, can now specify multiple functions, eg $7F will produce a Zebroid
image where each pixel is average(mean) of all bands selected by FuncMap and FuncMap2 args (or Func and Func2).
Threshold, MinTh, MaxTh, MnMx_MinTh, MnMx_MaxTh, matrix, lo, hi, and cmad,
all exactly the same functionality and defaults as in Zebra Filter.
Func argument, default 4 (AverageLuma), is function used in creating the result clip (same size and colorspace as input clip).
Func range 0 -> 6
0 ) YPlanemin(threshold=MinTh)
1 ) YPlanemax(threshold=MaxTh)
2 ) YPlaneminmaxDifference(MnMx_MinTh, MnMx_MaxTh) # Indiviually selectable min and max thresholds
3 ) YPlaneMedian
4 ) AverageLuma
5 ) YInRange
6 ) YPlaneStdev
Each pixel in the output clip is the average (mean) of the two pixels taken from the equivalent of the Zebra columns
(x coord [row=false in Zebra]) and Zebra rows (y coord [row=true in Zebra]) of the chosen Func bands.
'cmad', is processed on both row and column pixels prior to taking the mean and rendering each result pixel.
Returns same audio as input clip.
Zebroid:= A hybrid of Zebra and another equine animal.
############################################
The v2.58 version supports Y8 in avisynth v2.6.
Running version v2.6 on Avisynth v2.58, will not find a plugin named Zebra.
v2.6 dll Requires Avisynth v2.6 Alpha4+ as Alpha3 and below do not support VERSION 6 avisynth.h.
ssS
see Mediafire And/Or SendSpace below in my sig
v2.58, v2.60 x86 and x64 dll's + source + full VS2008 project files.
johnmeyer
12th April 2013, 23:10
I had a few minutes to play with this. The YInRange column definitely provides a little more control over the mask creation. Thanks!
StainlessS
12th April 2013, 23:23
Any suggestions for further band modes ? (EDIT, that can be calculated from a pixel count array)
johnmeyer
13th April 2013, 00:27
Any suggestions for further band modes ? (EDIT, that can be calculated from a pixel count array)I cannot say for sure whether this would be useful for my current project, but a "centered moving average" of rows might be a good way to smooth the mask.
General idea:
R = Moving average range
row(n)_average =
[row(n-R/2) + row(n-R/2 +1) + ... row(n) + ... row(n+R/2-1) + row(n+R/2)] / R
So, the general idea is to collect the min/max/median row values as you already have, but then replace one or more of these with the the calculated value for the current row, averaged with 1,2,3, ... of both the previous and following rows.
Centered moving averages work really well, but are a pain because you really want to stick with only odd numbers for R, and of course the values for the beginning and end rows cannot have a full range of averages, so you have to write extra code to deal with the end points (first row has no average; second row is averaged with the adjacent rows; and so on until you reach the R/2th row -- same for the last row).
I'm not sure this is going to make a difference for my current project, but you asked ...
Actually, as I think about it, this actually would help remove the need for all the blur functions, and even better, might tend to "feather" the edge of the mask.
StainlessS
13th April 2013, 01:11
OK, I'll have a go at this, I'll do a prototype in script and post for your approval before coding it in C++.
The script version will probably be quite slow.
johnmeyer
13th April 2013, 01:13
Thanks!
StainlessS
13th April 2013, 17:59
How does this grab ya.
Avisource("D:\avs\1955 Football 02.avi").Trim(0,-10)
ConvertToYV24()
Function CenteredMovingAve(clip c,int r) {
Assert(r>0,"MovingAve: r cannot be zero")
c c2=0 killaudio()
WW=width HH=height Frames=FrameCount
GScript("""
Even = !RT_BitTST(r,0)
if(Even) {r=r-1} # Make ALWAYS odd
r=r/2 # make radius
for(n=0,Frames-1) {
ras=0
For(y=0,hh-1) {
ave=0.0 div=0.0
if(Even && y-(r+1) >= 0) { # do even
a = RT_YPlaneMax(n=n,y=y-(r+1),h=1)
ave = ave + 0.5 * a
div = div + 0.5
}
For(off= -r, r) {
row=y+off
if(row>=0 && row<HH) {
a = RT_YPlaneMax(n=n,y=row,h=1)
ave = ave + a
div=div+1.0
}
}
if(Even && y+(r+1) < HH) { # do even
a = RT_YPlaneMax(n=n,y=y+(r+1),h=1)
ave = ave + 0.5 * a
div = div + 0.5
}
ave=ave / div
color=Int(ave+0.5)
scanline=c.BlankClip(Color_YUV=$8080+$10000*color,width=48,height=1,length=1)
ras=(IsClip(ras)) ? ras++scanline : scanline
}
ras=ras.WeaveRows(HH)
c2=(IsClip(c2)) ? c2++ras : ras
RT_Debug(String(n)+"] of ",string(Frames))
}
""")
return c2
}
ORG=Last
S=RT_Timer()
DIAG=CenteredMovingAve(ORG,24)
E=RT_Timer()
StackHorizontal(ORG,DIAG)
ConvertToRGB32()
RT_Debug("Time=",String(E-S))
Return Last
Its real slow, ~ 22 secs per frame with r==24, 1.8 secs @ r==1,7 secs @ r=7.
I've attempted to implement EVEN R.
EDIT:
first row has no average have not implemented like that, but could easily.
OOps, fixed (r/2+1) should be (r/2)
OOPS, Take 3. Hope I got it right this time.
Take 4, minor mod
johnmeyer
13th April 2013, 19:35
I'm in my garage with my front load washer in pieces. Have laptop on to follow nice instructional video of how to remove bearings. Will not be able to test your code until late today or tomorrow. Once again, thank you very, very much.
StainlessS
14th April 2013, 01:24
Zebra 1.03beta:
LINK REMOVED:
Zebra(clip c, Float "threshold"=0.0,int "matrix"=2,bool "Row"=true,int "lo"=128,int "hi"=255,int "cmad"=1,int "pix"=48)
# Avisynth v2.5/v2.6 Plugins by StainlessS
Creates a 6 bar clip in two modes,
"Row"=True, creates a set of 6 bars "pix" pixels wide (default 48) per bar and same height & colorspace as source clip.
Each horizontal pixel row in the bars represents the contents of the horizontal rows of the source clip.
"Row"=False, creates a set of 6 bars "pix" pixels tall (default 48) per bar and same width & colorspace as source clip.
Each vertical pixel column in the bars represents the contents of the vertical columns of the source clip.
The 6 bands it creates are (from left to right if Row==true and top to bottom if Row==false)
1 ) YPlanemin (0->255)
2 ) YPlanemax (0->255)
3 ) YPlaneminmaxDifference (0->255)
4 ) YPlaneMedian (0->255)
5 ) AverageLuma (rounded to nearest int, range 0 -> 255)
6 ) YInRange (population of pixels in range lo to hi, scaled 0->255 and rounded to nearest int)
"Threshold" used for bands 1, 2, and 3 as for eg YPlaneMin, 0.0->100.0%, Avoids extreme pixels, ie noise.
You might use eg YPlaneMin(Threshold=0.2) to ignore darkest 0.2% of pixels when finding minimum pixel luma.
YplaneMax(Threshold=0.2), ignores lightest 0.2% of pixels.
YplaneMinMaxDifference(Threshold=0.2), ignores darkest and lightest 0.2% of pixels.
YPlaneMedian, is essentially YPlaneMin(Threshold=50.0).
"Matrix",(For RGB -> Luma-Y conversion, not used in YUV modes)
0) = rec601
1) = rec709
2) = PC601
3) = PC709
"lo" and "hi", set pixel range for YInRange band.
"cmad", Centered Moving Averages Diameter, 1->100, default = 1 (OFF). Each row or column of pixels in the bands are averaged with neighbours
within the "cmad" diameter. A "cmad" of eg 13 would average each row/column with 6 neighbours on either side (plus itself =13).
Setting "cmad" greater than 1 will produce smoother, bands due to the averaging.
"pix", size of bands in pixels 4->64, default 48 (Mod 4 Only).
Zebra.dll is for Avisynth v2.58 and Zebra26.dll is for Avisynth v2.6.
The v2.58 version supports Y8 in avisynth v2.6.
Running version v2.6 on Avisynth v2.58, will not find a plugin named Zebra.
https://s24.postimg.cc/wuwda1vkl/CMAD_zpsae30b66c.jpg (https://postimg.cc/image/qtyocz8y9/)
StainlessS
17th April 2013, 14:57
v1.03beta updated to v1.3. See 1st post.
arg "pix" min changed from 1 to 4.
johnmeyer
22nd April 2013, 16:19
Finally getting back to this project. I tried your CenteredMovingAve function but I kept getting an error that there is no function called "WeaveRows." I queried my version of AVISynth and I am running 2.60, August 28, 201, Ben Rudiak-Gould. I think this version should include this extension, but perhaps this build did not.
Don't spend any time trying to help me with this minor issue because this is not a big deal: while it would be interesting to have the averaging provided by this function, the script is too slow to be practical, and I think I can proceed with either the modified Zebra function or the RT_YInRangeLocate function.
I'll post again, including some results, when I have worked my way through how to best use this function.
StainlessS
22nd April 2013, 17:18
2.60, August 28, 201
That version is nearly 2000 years old, update to Alpha 4 of Jan 2013 (WeaveRows new to that ver$).
The script function was only a prototype, to see if I got the logic correct, it seems AOK.
EDIT: I'll add a filter function to Zebra to apply CMAD to a clip.
johnmeyer
22nd April 2013, 17:44
I'll add a filter function to Zebra to apply CMAD to a clip.
Don't spend too much time on this. I'm trying various things and I think I can get what I need by doing motion compensation on the previous frame; then subtract that frame from the current frame; and then use RT_YInRangeLocate to generate a clip that I can feed into my mask generator.
My biggest hurdle will be perfecting that mask. I do lots of things with AVISynth, but have never had any success creating my own masks, although I've used some code created by Didee that involved masks, and it worked spectacularly well. I'll probably stick with what I did on my first attempt at this last week, and do the masking inside my editing program, Sony Vegas.
StainlessS
23rd April 2013, 10:28
John, changed my mind about doing an additional CMAD func in zebra, would be just as good
to just crop out the required Zebra band and resize to full frame, results should be just the same,
even pointresize should make no difference.
StainlessS
17th January 2015, 07:41
Zebra v1.04, new version, see 1st post.
Zebroid(clip c, Float "threshold"=0.0,int "matrix"=2,int "lo"=128,int "hi"=255,int "cmad"=1,int "func"=4)
Threshold, matrix, lo, hi, and cmad, all exactly the same functionality and defaults as in Zebra Filter.
New argument, Func, default 4 (AverageLuma), is function used in creating the result clip (same size and colorspace as input clip).
Func range 0 -> 5
0 ) YPlanemin
1 ) YPlanemax
2 ) YPlaneminmaxDifference
3 ) YPlaneMedian
4 ) AverageLuma
5 ) YInRange
Each pixel in the output clip is the average (mean) of the two pixels taken from the equivalent of the Zebra columns
(x coord [row=false in Zebra]) and Zebra rows (y coord [row=true in Zebra]) of the chosen Func bars.
'cmad', is processed on both row and column pixels prior to taking the mean and rendering each result pixel.
Returns same audio as input clip.
Zebroid:= A hybrid of Zebra and another equine animal.
Was looking though a PDF on scene change detection earlier today (well, yesterday, got to get to bed one day), and saw that somebody
had suggested a sort of equivalent resized and merged to full frame version of the Zebra row/column bars, for use in Scene Change Detection.
For use in SCD, they used frame split into 9 parts (3x3) and did detection on re-assembled clip after processing. Could not resist having a go,
and result is the Zebroid filter added here to Zebra Plugin.
Full image, CMAD=1 (off) [func=4 AverageLuma]
https://s20.postimg.cc/ye11zgdq5/Zebroid_01_zps44676d91.jpg (https://postimg.cc/image/8ihbg9bw9/)
Full image, CMAD=11 [func=4 AverageLuma]
https://s20.postimg.cc/h20pe0k8t/Zebroid_02_zps9c8e18bc.jpg (https://postimg.cc/image/xps7gif09/)
3x3 Images CMAD=1 [func=4 AverageLuma]
https://s20.postimg.cc/a02rrtgn1/Zebroid_03_zps24e7565e.jpg (https://postimg.cc/image/4onv73uk9/)
3x3 Images CMAD=11 [func=4 AverageLuma]
https://s20.postimg.cc/ijm5pkozh/Zebroid_04_zps608afe6a.jpg (https://postimg.cc/image/b3mw3s1a1/)
Script supplied in zip
#avisource("TEST.avi").trim(10000,0)
#ImageSource("dq-tools.jpg",end=0)
Colorbars.killaudio
#convertToYv12
#convertToYUY2
#ConvertToRGB32
#ConvertToRGB24
############## CONFIG ##########
CMAD=1
LO=64
HI=191
FUNC=4 # 0 -> 5
################################
return StackVertical(zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC))
WW = Round(Width / 12.0) * 4
HH = Round(Height / 12.0) * 4
TL=Crop(0,0,WW,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
TM=Crop(WW,0,Width-WW*2,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
TR=Crop(Width-WW,0,WW,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
ML=Crop(0,HH,WW,Height-HH*2).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
MM=Crop(WW,HH,Width-WW*2,Height-HH*2).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
MR=Crop(Width-WW,HH,WW,Height-HH*2).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
BL=Crop(0, Height-HH,WW,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
BM=Crop(WW,Height-HH,Width-WW*2,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
BR=Crop(Width-WW,Height-HH,WW,HH).zebroid(lo=LO,hi=HI,cmad=CMAD,func=FUNC)
T=StackHorizontal(TL,TM,TR)
M=StackHorizontal(ML,MM,MR)
B=StackHorizontal(BL,BM,BR)
Z=StackVertical(T,M,B)
StackVertical(Z) # or maybe with CMAD=1: return Z.Blur(1.58).Blur(1.58).ConvertToRGB32
return ConvertToRGB32
EDIT: Oops, copied same link twice for last two images, fixed.
EDIT: Or this is probably better for SCD with CMAD=1 (Off) and Blur(1.58).Blur(1.58),
no hard edges between 3x3 clips.
https://s20.postimg.cc/as5fr0ku5/Zebroid_05_zpsb94bf3ac.jpg (https://postimg.cc/image/gt34o37g9/)
EDIT: The Pdf mentioned: http://arhcmus.googlecode.com/svn/trunk/Paper/Scene%20Detection%20Paper/Survey%20-%20LI_Korpi-Anttila.pdf
EDIT: The Zebroid output (according to the pdf) would need some kind of additional 'line analysis', but I think it might actually
work (to some degree) on its own. I'll have to go back and read the rest of the pdf, I stopped immediately that I read about it
and dashed off to do the Zebroid thing.
StainlessS
30th March 2015, 19:36
Zebra v1.05, see 1st post.
Changed Matrix arg default (to include width>1100), Recompile v2.6 dll with Avisynth Version 6 Header.
Zebra(clip c, Float "threshold"=0.0,int "matrix"=(c.width>1100 || c.height>600)?3:2,
\ bool "Row"=true,int "lo"=128,int "hi"=255,int "cmad"=1,int "pix"=48)
StainlessS
20th March 2018, 04:01
EQuid, ZebraTest() mod.
Function Equid(clip c,Float "Thresh",Float "Lo",Float "Hi",Int "CMad",Int "Bands",
\ Bool "Zebroid",Float "zThresh",Float "zLo",Float "zhi",Int "zCMad",Int "zFunc",
\ Bool "Subs") {
/*
Equid, Hoofed mammal with Mane (or an on-line £1.00 coin).
Equid, a ZebraTest() script mod, revamped as a script function.
Main advantage is the number of bars are selectable (from highest downwards), eg Bands=1 selects bar 5, ie YInRange bar.
The least useful [ie YPlaneMin(func band=0) and YPlaneMax(func band=1)] are included only if selecting Bands=6 and 5
respectively.
In addition to the normal Zebra() functionality provided in ZebraTest script, this effort allows selection of
Zebroid functionality (when Zebroid bool = true, where the 'z...' args become relevant).
If Zebroid is applied to the incoming clip, then the Zebra bands are created using the Zebroid result as source.
See ZebraTest() script for further usage. https://forum.doom9.org/showthread.php?t=167663
*/
c PIX=48
Thresh=Default(Thresh,0.0) Lo=Round(Default(Lo,128)) Hi=Round(Default(Hi,255.0)) CMad=Default(CMad,1) Bands=Default(Bands,4)
Zebroid=Default(Zebroid,false) zThresh=Default(zThresh,0.0)
zLo=Round(Default(zLo,128)) zHi=Round(Default(zHi,255)) zCMad=Default(zCMad,1) zFunc=Default(zFunc,4) Subs=Default(Subs,True)
Assert(1 <= Bands <= 6,String(Bands,"ZebBoard: 1 <= Bands <= 6(%.0f)"))
Zebroid?Assert(0 <= zFunc <= 5,String(Bands,"ZebBoard: 0 <= zFunc <= 5(%.0f)")):NOP
zFnName=Select(zFunc,"Min","Max","Mx-Mn","Med","Ave","Yir")
(Zebroid) ? Zebroid(Threshold=zThresh,lo=Round(zLo),hi=Round(zHi),cmad=zCMad,func=zFunc) : NOP
Z1=Zebra(row=true,threshold=Thresh,lo=Round(LO),hi=Round(HI),pix=PIX,cmad=CMAD).Crop((6-Bands)*Pix,0,Pix*Bands,0)
Z2=Zebra(row=false,threshold=Thresh,lo=Round(LO),hi=Round(HI),pix=PIX,cmad=CMAD).Crop(0,(6-Bands)*Pix,0,Pix*Bands)
Z1=Z1.SUBTITLE("Row\nTrue", x=(Bands)*PIX/2-15,y=Z1.Height/2-10,Text_Color=$FFFFFF,lsp=0)
Z2=Z2.SUBTITLE("Row False",x=Z2.Width/2-37,y=(Bands)*PIX/2-10,Text_Color=$FFFFFF)
(Subs)?SubTitle("PIX="+String(PIX),y=height/2-50,Text_Color=$FFFFFF,Align=5):NOP
(Subs)?SubTitle("Thresh="+String(Thresh),y=height/2-30,Text_Color=$FFFFFF,Align=5):NOP
(Subs)?SubTitle("LO="+String(LO)+" HI="+String(hi),y=height/2-10,Text_Color=$FFFFFF,Align=5):NOP
(Subs)?SubTitle("CMAD="+String(CMAD),y=height/2+10,Text_Color=$FFFFFF,Align=5):NOP
(Subs&&Zebroid)?Subtitle(String(zThresh,"zThresh=%f\n")+String(zLo,"zLo=%.0f ")+String(zHi,"zHi=%.0f\n")+
\ String(zCMad,"zCMad=%.0f\n")+String(zFunc,"zFunc=%.0f [")+zFnName+"]",y=height/2+40,Text_Color=$FFFFFF,Align=5,lsp=0) : NOP
BLANK=Z2.BlankClip(width=Bands*PIX,color=$808080)
BLANK=(Bands>=6)?BLANK.SUBTITLE("MIN",x=(Bands-6) *PIX+PIX/2-15,y=(Bands-6)*PIX+PIX/2-10,Text_Color=$FFFFFF) :BLANK
BLANK=(Bands>=5)?BLANK.SUBTITLE("MAX",x=(Bands-5) *PIX+PIX/2-15,y=(Bands-5)*PIX+PIX/2-10,Text_Color=$FFFFFF) :BLANK
BLANK=(Bands>=4)?BLANK.SUBTITLE("MX-MN",x=(Bands-4)*PIX+PIX/2-24,y=(Bands-4)*PIX+PIX/2-10,Text_Color=$FFFFFF) :BLANK
BLANK=(Bands>=3)?BLANK.SUBTITLE("MED",x=(Bands-3) *PIX+PIX/2-15,y=(Bands-3)*PIX+PIX/2-10,Text_Color=$FFFFFF) :BLANK
BLANK=(Bands>=2)?BLANK.SUBTITLE("AVE",x=(Bands-2) *PIX+PIX/2-15,y=(Bands-2)*PIX+PIX/2-10,Text_Color=$FFFFFF) :BLANK
BLANK =BLANK.SUBTITLE("YIR",x=(Bands-1) *PIX+PIX/2-15,y=(Bands-1)*PIX+PIX/2-10,Text_Color=$FFFFFF)
Return StackVertical(StackHorizontal(Z1),StackHorizontal(Z2,BLANK))
}
EDIT: Added Round() on internal Lo/Hi zLo/ZHi args.
Imagesource("DQ-Tools.jpg",end=0)
Return Equid(CMad=3,Bands=3)
#Return Equid(CMad=10,Bands=3,Zebroid=True,zFunc=5)
https://s20.postimg.cc/i8qa37r8d/EQuid_1.jpg
https://s20.postimg.cc/tl2vl0n2l/EQuid_2.jpg
EDIT:
q] What use is it ?
a] No idea, but I'm experimenting with it in Spatial Alignment of clips [EQuid, as a viewer for perusal].
StainlessS
15th August 2018, 15:08
Zebra v1.06, new version see 1st post.
/*
v1.04, 15 Jan 2015. Added Zebroid.
v1.05, 30 Mar 2015. changed RGB Matrix default, (c.width>1100 || c.height>600)?3[PC709]:2[REC601]
Recompile v2.6 dll with Avisynth Version 6 Header.
v1.06, 15 Aug 2018. Added Version Resource. Recompile VS2008 Avs v2.58, AVs+ v2.60 x86 & x64.
*/
Zip about 112KB incl source + full VS2008 Project Files. (requires recent avs+ headers).
Headers (and ones in avs directory):- https://github.com/pinterf/AviSynthPlus/tree/MT/avs_core/include
EDIT: Some broken image links in previous posts fixed.
StainlessS
11th September 2018, 05:04
Zebra v1.07, new version see 1st post.
/*
v1.04, 15 Jan 2015. Added Zebroid.
v1.05, 30 Mar 2015. changed RGB Matrix default, (c.width>1100 || c.height>600)?3[PC709]:2[REC601]
Recompile v2.6 dll with Avisynth Version 6 Header.
v1.06, 15 Aug 2018. Added Version Resource. Recompile VS2008 Avs v2.58, AVs+ v2.60 x86 & x64.
v1.07, 11 Sept 2018. Added MinTh, MaxTh, MnMx_MinTh, MnMx_MaxTh, FuncMap args.
*/
Mod of EQuid() Script, as supplied in Zip
Function Equid(clip c,Float "Thresh",Int "Lo",Int "Hi",Int "CMad",Int "Bands",
\ Float "MinTh", Float "MaxTh",Float "MnMx_MinTh",Float "MnMx_MaxTh",Int "FuncMap",
\ Bool "Zebroid",Float "zThresh",Int "zLo",Int "zhi",Int "zCMad",Int "zFunc",
\ Float "zMinTh", Float "zMaxTh",Float "zMnMx_MinTh",Float "zMnMx_MaxTh",
\ Bool "SubsI",Bool "SubsO"
\ ) {
/*
Equid, Hoofed mammal with Mane (or an on-line £1.00 coin).
Equid, a ZebraTest() script mod, revamped as a script function.
Shows Zebra Bands for clip c.
Zebra bands selectable via Bands(default 6, ie all, from highest band downwards, so Bands=2 selects YInRange & AverageLuma)
or via a FuncMap bit map(default $3F ie all), where each set bit selects a Zebra band
(Where the min/max/minmaxdif default to Thresh).
Bit 0, ($01), YPlaneMin(Threshold=MinTh)
Bit 1, ($02), YPlaneMax(Threshold=MaxTh)
Bit 2, ($04), YPlaneMinMaxDifference(MnMx_MinTh, MnMx_MaxTh) # MinMaxDif band has individually selectable thresholds
Bit 3, ($08), YPlaneMedian
Bit 4, ($10), AverageLuma
Bit 5, ($20), YInRange(lo=Lo,hi=Hi)
By Default All Bands are $3F, dec 63.
Thresh, Default 0.0, is group default setting for the minimum and maximum thresholds.
lo,hi, Defaults Lo=128, hi=255 YInRange(Lo,hi) band. YInRange shows population between lo and high (where white=100%).
Bands, Default 6, as described above. (selects from highest band [YInRange] downwards). (0=none selected).
MinTh, Default Thresh. Threshold for YPlaneMin band.
MaxTh, Default Thresh. Threshold for YPlaneMax band.
MnMx_MinTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Minimum threshold), individually selectable threshold.
MnMx_MaxTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Maximum threshold), individually selectable threshold.
FuncMap, Default $3F, dec 63m, ie all bands selected. (0=none selected).
Zebroid, Default False.
In addition to the normal Zebra() functionality provided in ZebraTest script, this effort allows selection of
Zebroid functionality (when Zebroid bool = true, where the 'z...' args become relevant).
If Zebroid is applied to the incoming clip, then the Zebra bands are created using the Zebroid result as source.
q) Whats its purpose ?, a) Dont know, just experiment.
zXXX args, As For above args but only if Zebroid=True, and applied to incoming Zebroid'ed clip before Zebra bands created.
SubsI, Default True, If True, show subtitles on inner clip (source of Zebroid).
SubsO, Default SubI, If True, show subtitles on outter clips, Zebra bands if selected.
NOTE, Can only supply EITHER Bands OR FuncMap, not both, and if suppled as 0, and Zebroid=False, then function returns src clip.
*/
myName="EQuid: "
c PIX=48
Assert(!(Bands.Defined && FuncMap.Defined),RT_String("%sCannot specify both Bands and FuncMap",myName))
FuncMap = !FuncMap.Defined ? RT_BitXor($3F,RT_BitLSR($3F,Default(Bands,6))) : FuncMap
Thresh =Default(Thresh,0.0) Lo=Default(Lo,128) Hi=Default(Hi,255) CMad=Default(CMad,1) Bands=Default(Bands,4)
MinTh =Default(MinTh,Thresh) MaxTh=Default(MaxTh,Thresh)
MnMx_MinTh =Default(MnMx_MinTh,Thresh) MnMx_MaxTh=Default(MnMx_MaxTh,Thresh)
Zebroid =Default(Zebroid,false) zThresh=Default(zThresh,0.0)
zLo =Default(zLo,128) zHi=Default(zHi,255)
zCMad =Default(zCMad,1) zFunc=Default(zFunc,4)
zMinTh =Default(zMinTh,zThresh) zMaxTh=Default(zMaxTh,zThresh)
zMnMx_MinTh=Default(zMnMx_MinTh,zThresh) zMnMx_MaxTh=Default(zMnMx_MaxTh,zThresh)
SubsI=Default(SubsI,True) SubsO=Default(SubsO,SubsI)
Zebroid?Assert(0 <= zFunc <= 5,RT_String("%s0 <= zFunc <= 5(%.0f)",myName,zFunc)):NOP
zFnName=Select(zFunc,"Min","Max","Mx-Mn","Med","Ave","Yir")
(Zebroid) ? Zebroid(Threshold=zThresh,lo=Round(zLo),hi=Round(zHi),cmad=zCMad,func=zFunc,
\ MinTh=zMinTh,Maxth=zMaxTh,MnMx_MinTh=zMnMx_MinTh,MnMx_MaxTh=zMnMx_MaxTh)
\ : NOP
Bands=RT_BitSetCount(FuncMap)
Z1=(Bands==0)?0:Last.Zebra(row=true,threshold=Thresh,lo=Round(LO),hi=Round(HI),pix=PIX,cmad=CMAD,
\ MinTh=MinTh,Maxth=MaxTh,MnMx_MinTh=MnMx_MinTh,MnMx_MaxTh=MnMx_MaxTh,FuncMap=FuncMap)
Z2=(Bands==0)?0:Zebra(row=false,threshold=Thresh,lo=Round(LO),hi=Round(HI),pix=PIX,cmad=CMAD,
\ MinTh=MinTh,Maxth=MaxTh,MnMx_MinTh=MnMx_MinTh,MnMx_MaxTh=MnMx_MaxTh,FuncMap=FuncMap)
S1=(!SubsI) ? "" : RT_String("\nMinTh=%.2f MaxTh=%.2f\nMnMx_MinTh=%.2f MnMx_MaxTh=%.2f\nLo=%d Hi=%d\nCMad=%d",
\ Minth,MaxTh,MnMx_MinTh,MnMx_MaxTh,Lo,Hi,CMad)
S2=(!(SubsI&&Zebroid)) ? "" : RT_String("\n\nzMinTh=%.2f zMaxTh=%.2f\nzMnMx_MinTh=%.2f zMnMx_MaxTh=%.2f\nzLo=%d zHi=%d\nzCMad=%d",
\ zMinth,zMaxTh,zMnMx_MinTh,zMnMx_MaxTh,zLo,zHi,zCMad)
S=S1+S2 Lines=RT_TxtQueryLines(S) Y=(Height-Lines*18) / 2 S=S.RT_StrReplace(Chr(10),"\n")
Z1=(Bands!=0&&SubsO)?Z1.SUBTITLE("Row\nTrue",Align=5,lsp=0):Z1
Z2=(Bands!=0&&SubsO)?Z2.SUBTITLE("Row False",y=(Z2.Height+12)/2.0,Align=5):Z2
(SubsI) ? SubTitle(S,Align=5,Y=Y,lsp=0) : NOP
Function BandSub(clip c,int FuncMap,Int Bands) {
c myName="EQuid::BandSub: "
IsAvsPlus=(FindStr(UCase(versionString),"AVISYNTH+")!=0) HasGScript=RT_FunctionExist("GScript")
Assert(IsAvsPlus || HasGScript,RT_String("%sNeed Avs+ or GScript",myName))
GS="""
off=0 PixX=Width.Float/Bands PixY=Height.Float/Bands
for(i=0,5) {
if(RT_BitTst(FuncMap,i)) {
Fnam=Select(i,"Min","Max","Mx-Mn","Med","Ave","Yir")
len=StrLen(Fnam) x=(Off+0.5)*PixX-(4.5*Len) y=(Off+0.5)*PixY-11
SUBTITLE(fnam,x=x,y=y)
off = off + 1
}
}
"""
HasGScript?GScript(GS) : Eval(GS)
Return Last
}
BLANK=(Z2.IsClip)?Z2.BlankClip(width=Z1.Width,color=$808080):0
Blank=(Blank.IsClip&&SubsO)?Blank.BandSub(FuncMap,Bands):Blank
Return (Blank.IsClip)?StackVertical(StackHorizontal(Z1),StackHorizontal(Z2,BLANK)):Last
}
/*
#Client_script
AVISource("D:\G.avi")
#Colorbars.KillAudio
Crop(0,0,Width/4*4,Height/4*4)
ConvertToYV12
FUNCMAP = $3f # 0 -> $3F
return Equid(FuncMap=FUNCMAP)
*/
EDIT:
AVISource("D:\Greymouse.avi")
Crop(12,12,-12,-12)
Crop(0,0,Width/4*4,Height/4*4)
ConvertToYV12
FUNCMAP = $2C # bits 2, 3, and 5, YPlaneMinMaxdif, YPlaneMedian, YInRange
return Equid(MnMx_MinTh=5,MnMx_MaxTh=10,Lo=140,hi=255,FuncMap=FUNCMAP)
https://s20.postimg.cc/8kq99rk3t/Equid.jpg (https://postimg.cc/image/8kq99rk3t/)
StainlessS
18th September 2018, 12:32
Zebra v1.10, new version see first post.
/*
v1.04, 15 Jan 2015. Added Zebroid.
v1.05, 30 Mar 2015. changed RGB Matrix default, (c.width>1100 || c.height>600)?3[PC709]:2[REC601]
Recompile v2.6 dll with Avisynth Version 6 Header.
v1.06, 15 Aug 2018. Added Version Resource. Recompile VS2008 Avs v2.58, AVs+ v2.60 x86 & x64.
v1.07, 11 Sept 2018. Added MinTh, MaxTh, MnMx_MinTh, MnMx_MaxTh, FuncMap args.
v1.10, 18 Sept 2018. Bugfix v1.07 RGB24 Zebroid hang (infinite loop).
Added, lo2, hi2, cmad2, func2, minTh2, maxTh2, mnmx_minTh2, mnmx_maxTh2, funcmap2 args.
Added, YPlaneStdev function to both Zebra and Zebroid.
*/
Added new band, YPlaneStdev.
Update to Equid script, (args have changed due to expansion, now uses FuncMap rather than Func arg).
EQuid.avs (Included in zip)
Function Equid(clip c,Float "Thresh",Int "FuncMap",Int "Matrix",
\
\ Float "MinTh" , Float "MaxTh" ,Float "MnMx_MinTh" ,Float "MnMx_MaxTh" ,Int "Lo" ,Int "Hi" , Int "CMad" ,
\ Float "MinTh2", Float "MaxTh2",Float "MnMx_MinTh2",Float "MnMx_MaxTh2",Int "Lo2",Int "Hi2", Int "CMad2",
\
\ Bool "Zebroid",Float "zThresh",
\ int "zFuncmap", Float "zMinTh" , Float "zMaxTh" ,Float "zMnMx_MinTh" ,Float "zMnMx_MaxTh" ,Int "zLo" ,Int "zhi" ,Int "zCMad",
\ int "zFuncmap2", Float "zMinTh2", Float "zMaxTh2",Float "zMnMx_MinTh2",Float "zMnMx_MaxTh2",Int "zLo2",Int "zhi2",Int "zCMad2",
\
\ Bool "SubsI",Bool "SubsO"
\ ) {
/*
Equid v1.0.
Equid, Hoofed mammal with Mane (or an on-line £1.00 coin).
Equid, a ZebraTest() script mod, revamped as a script function.
Equid(clip c,Float "Thresh"=0.0,Int "FuncMap"=$7F,Int "Matrix"=c.Width>=1100||c.Height>=600?3:2,
\
\ Float "MinTh"=Thresh, Float "MaxTh"=Thresh,Float "MnMx_MinTh"=Thresh,Float "MnMx_MaxTh"=Thresh,
\ Int "Lo"=128,Int "Hi"=255,Int "CMad"=1,
\
\ Float "MinTh2"=Thresh,Float "MaxTh2"=Thresh,Float "MnMx_MinTh2"=Thresh,Float "MnMx_MaxTh2"=Thresh,
\ Int "Lo2"=lo,Int "Hi2"=hi, Int "CMad2"=CMad,
\
\ Bool "Zebroid"=False,Float "zThresh"=Thresh),
\
\ int "zFuncmap"=$10(AverageLuma, Float "zMinTh" , Float "zMaxTh" ,Float "zMnMx_MinTh" ,Float "zMnMx_MaxTh" ,
\ Int "zLo"=128 ,Int "zhi"=255 ,Int "zCMad"=1,
\
\ int "zFuncmap2"=zFuncMap, Float "zMinTh2"=zThresh, Float "zMaxTh2"=zThresh,Float "zMnMx_MinTh2"=zThresh,Float "zMnMx_MaxTh2"=zThresh,
\ Int "zLo2"=zlo,Int "zhi2"=zhi,Int "zCMad2"=zCMad,
\
\ Bool "SubsI"=True,Bool "SubsO"=SubsI
Shows Zebra Bands for clip c.
Zebra bands selectable via FuncMap bit map(default $7F ie all), where each set bit selects a Zebra band
(Where the min/max thresholds default to Thresh).
Bit 0, ($01), YPlaneMin(Threshold=MinTh)
Bit 1, ($02), YPlaneMax(Threshold=MaxTh)
Bit 2, ($04), YPlaneMinMaxDifference(MnMx_MinTh, MnMx_MaxTh) # MinMaxDif band has individually selectable thresholds
Bit 3, ($08), YPlaneMedian
Bit 4, ($10), AverageLuma
Bit 5, ($20), YInRange(lo=Lo,hi=Hi)
Bit 6, ($40), YPlaneStdev
All Bands are $7F, dec 127.
Thresh, Default 0.0, is group default setting for the minimum and maximum thresholds.
FuncMap, Default $7F, dec 127, ie all bands selected. (0=none selected).
Matrix, Default (Width>=1100||Height>=600?3:2 # 3=PC.709, 2=PC.601 (0=rec.601, 1=rec.709)
Matrix for RGB->Luma Y conversion.
Row=True, Args:
MinTh, Default Thresh. Threshold for YPlaneMin band.
MaxTh, Default Thresh. Threshold for YPlaneMax band.
MnMx_MinTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Minimum threshold), individually selectable threshold.
MnMx_MaxTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Maximum threshold), individually selectable threshold.
lo,hi, Defaults Lo=128, hi=255. YInRange(lo=lo,hi=hi) band. YInRange shows population between lo and hi (where white=100%).
CMad, Default 1, Off. Centered Moving Average Diameter. (1->100). Vertical smoothing of bands when Row=True.
Row=False, Args (default to same as Row=True args):
MinTh2, Default MinTh. Threshold for YPlaneMin band.
MaxTh2, Default MaxTh. Threshold for YPlaneMax band.
MnMx_MinTh2, Default MnMx_MinTh. Threshold for YPlaneMinMaxDifference(Minimum threshold), individually selectable threshold.
MnMx_MaxTh2, Default MnMx_MaxTh. Threshold for YPlaneMinMaxDifference(Maximum threshold), individually selectable threshold.
lo2,hi2, Defaults Lo2=lo, hi2=hi. YInRange(Lo2,hi2) band. YInRange shows population between lo2 and hi2 (where white=100%).
CMad2, Default CMad. Centered Moving Average Diameter. (1->100). Horizontal smoothing of bands when Row=false.
Zebroid, Default False, OFF.
zXXX args, As For above args but only if Zebroid=True, and applied to incoming Zebroid'ed clip before Zebra bands created.
In addition to the normal Zebra() functionality provided in ZebraTest script, this effort allows selection of
Zebroid functionality (when Zebroid bool = true, where the 'z...' args become relevant).
If True, Zebroid is applied to the incoming clip, then the Zebra bands are created using the Zebroid result as source.
q) Whats its purpose ?, a) Dont know, just experiment.
zThresh, Default 0.0, is group default setting for the minimum and maximum threshold for zxxx args.
Zebroid Row Args, As for Zebra Row=True.
zFuncMap, Default $10(AverageLuma)
zMinTh, Default zThresh. Threshold as for Row=true, zFunc = 0(YPlaneMin).
zMaxTh, Default zThresh. Threshold as for Row=true, zFunc = 1(YPlaneMax).
zMnMx_MinTh, Default zThresh. Threshold as for Row=true, zFunc = 2(YPlaneMinMaxDifference(Minimum threshold).
zMnMx_MaxTh, Default zThresh. Threshold as for Row=true, zFunc = 2(YPlaneMinMaxDifference(Maximum threshold).
zlo,zhi, Defaults zLo=128, zhi=255. As for zFunc=5, YInRange(zLo,zhi).
zCMad, Default 1, Off. Centered Moving Average Diameter. (1->100). Vertical smoothing.
Zebroid Column Args, As for Zebroid Row=True.
zFuncMap2, Default zFuncMap.
zMinTh2, Default zMinTh. Threshold as for Row=true, zFunc2 = 0(YPlaneMin).
zMaxTh2, Default zMaxTh. Threshold as for Row=true, zFunc2 = 1(YPlaneMax).
zMnMx_MinTh2, Default zMnMx_MinTh. Threshold as for Row=true, zFunc2 = 2(YPlaneMinMaxDifference(Minimum threshold).
zMnMx_MaxTh2, Default zMnMx_MaxTh. Threshold as for Row=true, zFunc2 = 2(YPlaneMinMaxDifference(Maximum threshold).
zlo2,zhi2, Defaults zLo2=zlo, zhi2=zhi. As for zFunc2, YInRange(zLo2,zhi2).
zCMad2, Default zCMad. Centered Moving Average Diameter. (1->100). Horizontal smoothing.
SubsI, Default True, If True, show subtitles on inner clip (source or Zebroid). # EDIT: Was (source of Zebroid)
SubsO, Default SubI, If True, show subtitles on outter clips, Zebra bands if selected.
*/
myName="EQuid: " c PIX=48
######
# Zebra Args (defaults for both ROW and COLUMN)
FuncMap = Default(FuncMap,$7F) Thresh = Default(Thresh,0.0)
Matrix=Default(Matrix,Width>=1100||Height>=600?3:2) # Default PC Levels 3=PC.709, 2=Rec.601
MinTh = Default(MinTh,Thresh) MaxTh = Default(MaxTh,Thresh)
MnMx_MinTh = Default(MnMx_MinTh,Thresh) MnMx_MaxTh = Default(MnMx_MaxTh,Thresh)
Lo = Default(Lo,128) Hi = Default(Hi,255)
CMad = Default(CMad,1)
# Zebra Args COLUMN (default as for ROW)
MinTh2 = Default(MinTh2,MinTh) MaxTh2 = Default(MaxTh2,MaxTh)
MnMx_MinTh2 = Default(MnMx_MinTh2,MnMx_MinTh) MnMx_MaxTh2 = Default(MnMx_MaxTh2,MnMx_MaxTh)
Lo2 = Default(Lo2,lo) Hi2 = Default(Hi2,Hi)
CMad2 = Default(CMad2,CMad)
### Zebroid Args (defaults for both ROW and COLUMN)
Zebroid = Default(Zebroid,false) zThresh = Default(zThresh,Thresh)
#
zFuncMap = Default(zFuncMap,$10) # AverageLuma
zMinTh = Default(zMinTh,zThresh) zMaxTh = Default(zMaxTh,zThresh)
zMnMx_MinTh = Default(zMnMx_MinTh,zThresh) zMnMx_MaxTh = Default(zMnMx_MaxTh,zThresh)
zLo = Default(zLo,128) zHi = Default(zHi,255)
zCMad = Default(zCMad,1)
# Zebroid Args COLUMN (default as for Zebroid ROW)
zFuncMap2 = Default(zFuncMap2,zFuncMap)
zMinTh2 = Default(zMinTh2,zMinTh) zMaxTh2 = Default(zMaxTh2,zMaxTh)
zMnMx_MinTh2 = Default(zMnMx_MinTh2,zMnMx_MinTh) zMnMx_MaxTh2= Default(zMnMx_MaxTh2,zMnMx_MaxTh)
zLo2 = Default(zLo2,zLo) zHi2 = Default(zHi2,zHi)
zCMad2 = Default(zCMad2,zCMad)
### Common args
SubsI = Default(SubsI,True) SubsO = Default(SubsO,SubsI)
Zebroid?Assert(1 <= zFuncMap <= $7F,RT_String("%s1 <= zFuncMap <= $7F(%d)",myName,zFuncMap)) : NOP
Zebroid?Assert(1 <= zFuncMAp2 <= $7F,RT_String("%s1 <= zFuncMap2 <= $7F(%d)",myName,zFuncMap2)) : NOP
###### If Zebroid, then Proc Zebroid on incomimng clip.
(Zebroid) ? Zebroid(Threshold=zThresh,matrix=Matrix,
\ lo =zLo ,hi=zHi ,cmad=zCMad ,MinTh=zMinTh ,Maxth=zMaxTh ,MnMx_MinTh=zMnMx_MinTh ,MnMx_MaxTh=zMnMx_MaxTh,FuncMap=zFuncMap,
\ lo2=zLo2,hi2=zHi2,cmad2=zCMad2,MinTh2=zMinTh2,Maxth2=zMaxTh2,MnMx_MinTh2=zMnMx_MinTh2,MnMx_MaxTh2=zMnMx_MaxTh2,FuncMap2=zFuncMap2)
\ : NOP
S2=(SubsI&&Zebroid) ? RT_String("\nzMinTh=%.2f zMaxTh=%.2f\nzMnMx_MinTh=%.2f zMnMx_MaxTh=%.2f\nzLo=%d zHi=%d zCMad=%d zFuncMap=$%X\n",
\ zMinth,zMaxTh,zMnMx_MinTh,zMnMx_MaxTh,zLo,zHi,zCMad,zFuncMap) : ""
S2=S2+ ((SubsI&&Zebroid&&(zMinTh!=zMinth2||zMaxTh!=zMaxTh2||zMnMx_MinTh!=zMnMx_MinTh2||zMnMx_MaxTh!=zMnMx_MaxTh2))
\ ? RT_String("zMinTh2=%.2f zMaxTh2=%.2f\nzMnMx_MinTh2=%.2f zMnMx_MaxTh2=%.2f\n",zMinth2,zMaxTh2,zMnMx_MinTh2,zMnMx_MaxTh2) : "")
S2=S2+ ((SubsI&&Zebroid&&(zlo!=zLo2||zhi!=zhi2||zCMad!=zCMad2||zFuncMap!=zFuncMap2))
\ ? RT_String("zLo2=%d zHi2=%d zCMad2=%d zFuncMap2=$%2X",zLo2,zHi2,zCMad2,zFuncMap2) : "")
###### If (BandCnt>0) then Proc Zebra
BandCnt = RT_BitSetCount(FuncMap)
RowC=(BandCnt==0)?0:Last.Zebra(threshold=Thresh,matrix=Matrix,row=TRUE,
\ lo=Lo, hi=Hi, cmad=CMad, pix=PIX,minTh=MinTh, maxth=MaxTh, MnMx_MinTh=MnMx_MinTh, MnMx_MaxTh=MnMx_MaxTh, funcMap=FuncMap)
ColC=(BandCnt==0)?0:Last.Zebra(threshold=Thresh,matrix=Matrix,row=FALSE,
\ lo=Lo2,hi=Hi2,cmad=CMad2,pix=PIX,minTh=MinTh2,maxth=MaxTh2,MnMx_MinTh=MnMx_MinTh2,MnMx_MaxTh=MnMx_MaxTh2,funcMap=FuncMap)
RowC=(BandCnt!=0&&SubsO)?RowC.SUBTITLE("Row\nTrue",Align=5,lsp=0):RowC
ColC=(BandCnt!=0&&SubsO)?ColC.SUBTITLE("Row False",y=(ColC.Height+12)/2.0,Align=5):ColC
S1=(SubsI&&BandCnt>0) ? RT_String("FuncMap=$%2X\nMinTh=%.2f MaxTh=%.2f\nMnMx_MinTh=%.2f MnMx_MaxTh=%.2f\nLo=%d Hi=%d CMad=%d\n",
\ FuncMap,Minth,MaxTh,MnMx_MinTh,MnMx_MaxTh,Lo,Hi,CMad) : ""
S1=S1+ ((SubsI&&BandCnt>0&&(MinTh!=Minth2||MaxTh!=MaxTh2||MnMx_MinTh!=MnMx_MinTh2||MnMx_MaxTh!=MnMx_MaxTh2))
\ ? RT_String("MinTh2=%.2f MaxTh2=%.2f\nMnMx_MinTh2=%.2f MnMx_MaxTh2=%.2f\n",Minth2,MaxTh2,MnMx_MinTh2,MnMx_MaxTh2) : "")
S1=S1+ ( (SubsI&&BandCnt>0&&(lo!=Lo2||hi!=hi2||CMad!=CMad2))? RT_String("Lo2=%d Hi2=%d CMad2=%d\n",Lo2,Hi2,CMad2): "")
S=S1+S2 Lines=RT_TxtQueryLines(S) Y=(Height-Lines*18) / 2 S=S.RT_StrReplace(Chr(10),"\n")
(SubsI) ? SubTitle(S,Align=5,Y=Y,lsp=0) : NOP # Subtitle center Src or Zebroid'ed clip.
Function BandSub(clip c,int FuncMap,Int BandCnt) {
c myName="EQuid::BandSub: "
IsAvsPlus=(FindStr(UCase(versionString),"AVISYNTH+")!=0) HasGScript=RT_FunctionExist("GScript")
Assert(IsAvsPlus || HasGScript,RT_String("%sNeed Avs+ or GScript",myName))
GS="""
off=0 PixX=Width.Float/BandCnt PixY=Height.Float/BandCnt
for(i=0,6) {
if(RT_BitTst(FuncMap,i)) {
Fnam=Select(i,"Min","Max","Mx-Mn","Med","Ave","Yir","Std")
len=StrLen(Fnam) x=(Off+0.5)*PixX-(4.5*Len) y=(Off+0.5)*PixY-11
SUBTITLE(fnam,x=x,y=y)
off = off + 1
}
}
"""
HasGScript?GScript(GS) : Eval(GS)
Return Last
}
BLANK=(ColC.IsClip)?ColC.BlankClip(width=RowC.Width,color=$808080):0
Blank=(Blank.IsClip&&SubsO)?Blank.BandSub(FuncMap,BandCnt):Blank
Return (Blank.IsClip)?StackVertical(StackHorizontal(RowC),StackHorizontal(ColC,BLANK)):Last
}
/* Client Script
AVISource("D:\Greymouse.avi")
Crop(12,12,-12,-12)
Crop(0,0,Width/4*4,Height/4*4)
#ConvertToYV12
#ConvertToYUY2
#ConvertToRGB24
#ConvertToRGB32
#ConvertToY8
#ConvertToYV16
#ConvertToYV24
#ConvertToYV411
ORG=Last
FuncMap=$7F
CMad=1
Cmad2=Cmad
Thresh=1.0
Lo=128
Hi=255
Zebroid=True
ZFuncMap=$10
zLo=128
zHi=255
return Equid(funcmap=Funcmap,thresh=Thresh,lo=lo,hi=hi,CMad=CMad,CMad2=CMad2,Zebroid=Zebroid,zFuncMap=ZFuncMap, zlo=Lo,zhi=Hi)
*/
https://i.postimg.cc/K4HRBgFN/Equid.jpg (https://postimg.cc/K4HRBgFN)
StainlessS
2nd October 2019, 17:01
Zebra() v1.20, new version see first post.
v1.20, 02 Oct 2019. Added MskFunc stuff to Zebra, not implemented for Zebroid.
Zebra(clip c, Float "Threshold"=0.0,int "matrix"=(c.width>1100 || c.height>600)?3:2,
\ bool "Row"=true,int "lo"=128,int "hi"=255,int "cmad"=1,int "pix"=48
\ Float "MinTh"=threshold, Float "MaxTh"=threshold,Float "MnMx_MinTh"=threshold,Float "MnMx_MaxTh"=threshold,Int "FuncMap"=$FF,
\ Int "MskFunc"=4,Float "MskLoTh"=0.0,Float MskHiTh"=127.5,Int "MskInColY"=0,Int "MskOutColY"=255
\ )
###
0 ) YPlaneMin (0->255)
1 ) YPlaneMax (0->255)
2 ) YPlaneMinMaxDifference (0->255)
3 ) YPlaneMedian (0->255)
4 ) AverageLuma (rounded to nearest int, range 0 -> 255)
5 ) YInRange (population of pixels in range lo to hi, scaled 0->255 and rounded to nearest int [255.0 == 100%])
6 ) YPlaneStdev Luma Standard Deviation.
7 ) MskByRow(MskFunc=4) : where MskFunc is one of the previous bands numbers above, 0->6, default 4=AverageLuma.
FuncMap, Default $FF (dec 255), ie 8 bits set, selects all 8 bands.
Bit 0, ($01), YPlaneMin(Threshold=MinTh)
Bit 1, ($02), YPlaneMax(Threshold=MaxTh)
Bit 2, ($04), YPlaneMinMaxDifference(MnMx_MinTh, MnMx_MaxTh) # MinMaxDif band has individually selectable thresholds
Bit 3, ($08), YPlaneMedian
Bit 4, ($10), AverageLuma
Bit 5, ($20), YInRange(lo=Lo,hi=Hi)
Bit 6, ($40), YPlaneStdev()
Bit 7, ($80), MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY)
###
Bit 7, MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY) [ Bit 7 MskByRow Added in v1.20 for Zebra function ONLY]
MskFunc, 0->6, default 4(AverageLuma). The Band to create mask from.
MskLoTh,MskHiTh, 0.0 <= MskLoTh <= MskHiTh <= 255.0. MskLoTh default 0.0, MskHiTh default 127.5.
MskInColY, 0->255, Output color of band row/column if selected MskFunc band value is between MskLoTh and MskHiTh.
MskOutColY, 0->255, Output color of band row/column if selected MskFunc band value is NOT between MskLoTh and MskHiTh.
Any MskFunc function thresholds etc use those already defined. eg "MinTh" is threshold for YPlaneMin band 0 when MskFunc=0(YPlaneMin).
MskFunc Added only to Zebra(), not Zebroid(). [Might try add it when I figure out how]
Equid.avsi removed the Zebroid functionality, might replace it again at some stage.
Here current version Equid [Prev posted versions of equid should still work but without MskFunc functionality].
# Equid.avsi
/*
Equid v1.20. [ Equid, Hoofed mammal with Mane (or an on-line £1.00 coin) ]
Requires RT_Stats v1.43+, <Avs+> or <GScript>. Use eg GImport("D:\Equid.avsi") if GScript, Else use Import("D:\Equid.avsi").
Equid(clip c,Float "Thresh"=0.0,Int "FuncMap"=$FF,Int "Matrix"=c.Width>=1100||c.Height>=600?3:2,
\
\ [* ROW=True args *]
\ Float "MinTh"=Thresh, Float "MaxTh"=Thresh,Float "MnMx_MinTh"=Thresh,Float "MnMx_MaxTh"=Thresh,
\ Int "Lo"=128,Int "Hi"=255,Int "CMad"=1,
\ Int "MskFunc"=4, Float "MskLoTh"=0.0, Float "MskHiTh"=127.5, Int "MskInColY"=0, Int "MskOutColY"=255,
\
\ [* ROW=False args *]
\ Float "MinTh2"=MinTh,Float "MaxTh2"=MaxTh,Float "MnMx_MinTh2"=MnMx_MinTh,Float "MnMx_MaxTh2"=MnMx_MaxTh,
\ Int "Lo2"=lo,Int "Hi2"=hi, Int "CMad2"=CMad,
\ Int "MskFunc2"=MskFunc, Float "MskLoTh2"=MskLoTh, Float "MskHiTh2"=MskHiTh, Int "MskInColY2"=MskInColY, Int "MskOutColY2"=MskOutColY,
\
\ Bool "SubsI"=True,Bool "SubsO"=SubsI
\ )
Shows Zebra Bands for clip c.
Zebra bands selectable via FuncMap bit map(default $FF or dec 255, ie all), where each set bit selects a Zebra band
(Where the YPlane min/max type thresholds default to Thresh).
Bit 0, ($01), YPlaneMin(Threshold=MinTh)
Bit 1, ($02), YPlaneMax(Threshold=MaxTh)
Bit 2, ($04), YPlaneMinMaxDifference(MnMx_MinTh, MnMx_MaxTh) # MinMaxDif band has individually selectable thresholds
Bit 3, ($08), YPlaneMedian
Bit 4, ($10), AverageLuma
Bit 5, ($20), YInRange(lo=Lo,hi=Hi)
Bit 6, ($40), YPlaneStdev
Bit 7, ($80), MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY)
Thresh, Default 0.0, is group default setting for the minimum and maximum thresholds.
FuncMap, Default $FF, dec 255, ie all bands selected.
Matrix, Default (Width>=1100||Height>=600?3:2 # 3=PC.709, 2=PC.601 (0=rec.601, 1=rec.709)
Matrix for RGB->Luma Y conversion.
Row=True, Args:
MinTh, Default Thresh. Threshold for YPlaneMin band.
MaxTh, Default Thresh. Threshold for YPlaneMax band.
MnMx_MinTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Minimum threshold), individually selectable threshold.
MnMx_MaxTh, Default Thresh. Threshold for YPlaneMinMaxDifference(Maximum threshold), individually selectable threshold.
lo,hi, Defaults Lo=128, hi=255. YInRange(lo=lo,hi=hi) band. YInRange shows population between lo and hi (where white=100%).
CMad, Default 1, Off. Centered Moving Average Diameter. (1->100). Vertical smoothing of bands when Row=True. (Can be even)
MskFunc, Default=4(AveLuma) : MskByRow(MskFunc,MskLoTh,MskHiTh,MskInColY,MskOutColY)
MskLoTh, Default=0.0.
MskHiTh, Default=127.5. 0.0 <= MskLoTh <= MskHiTh <= 255.0
MskInColY Default 0.
MskOutColY Default 255.
Row=False, Args (default to same as Row=True args):
MinTh2, Default MinTh.
MaxTh2, Default MaxTh.
MnMx_MinTh2, Default MnMx_MinTh.
MnMx_MaxTh2, Default MnMx_MaxTh.
lo2,hi2, Defaults Lo2=lo, hi2=hi.
CMad2, Default CMad.
MskFunc2, Default=MskFunc
MskLoTh2, Default=MskLoTh.
MskHiTh2, Default=MskHiTh.
MskInColY2 Default MskInColY.
MskOutColY2 Default MskOutColY.
SubsI, Default True, If True, show inner subtitles.
SubsO, Default SubI, If True, show outer subtitles.
*/
Function Equid(clip c,Float "Thresh",Int "FuncMap",Int "Matrix",
\
\ [* ROW=True args *]
\ Float "MinTh" , Float "MaxTh" , Float "MnMx_MinTh" ,Float "MnMx_MaxTh" ,Int "Lo" ,Int "Hi" , Int "CMad" , Int "MskFunc", Float "MskLoTh", Float "MskHiTh", Int "MskInColY", Int "MskOutColY",
\
\ [* ROW=False args *]
\ Float "MinTh2", Float "MaxTh2", Float "MnMx_MinTh2",Float "MnMx_MaxTh2",Int "Lo2",Int "Hi2", Int "CMad2", Int "MskFunc2", Float "MskLoTh2", Float "MskHiTh2",Int "MskInColY2",Int "MskOutColY2",
\
\ Bool "SubsI",Bool "SubsO" [* Inner, Outer subtitles switches *]
\ ) {
Function FuncNameExists(String Fn) {Try{Eval(Fn+"()")B=True}catch(e){Assert(e.FindStr("syntax")==0,"FuncNameExists: Error in Function Name '"+Fn+"'")B=(e.FindStr("no function named")==0)} Return B}
Function IsAvsPlus() { Return RT_FunctionExist("autoloadplugins") }
Function HasGScript() { Return RT_FunctionExist("GSCript") }
Function OpName(int i){ Return Select(i,"Min","Max","Mx-Mn","Med","Ave","Yir","Std","Msk") }
Function BandSub(clip c,int FuncMap,Int BandCnt) {
c
off=0 PixX=Width.Float/BandCnt PixY=Height.Float/BandCnt
for(i=0,7) {
if(RT_BitTst(FuncMap,i)) {
Fnam=OpName(i)
len=StrLen(Fnam) x=(Off+0.5)*PixX-(4.5*Len) y=(Off+0.5)*PixY-11
SUBTITLE(fnam,x=x,y=y)
off = off + 1
}
}
Return Last
}
c myName="EQuid: " PIX=48
Assert(FuncNameExists("RT_Stats"),myName+"Need RT_Stats")
Assert(IsAvsPlus || HasGScript,RT_String("%sNeed Avs+ or GScript",myName))
######
# Zebra Args (defaults for both ROW and COLUMN)
Thresh = Default(Thresh,0.0) FuncMap = Default(FuncMap,$FF)
Matrix=Default(Matrix,Width>=1100||Height>=600?3:2) # Default PC Levels 3=PC.709, 2=Rec.601
MinTh = Default(MinTh,Thresh) MaxTh = Default(MaxTh,Thresh)
MnMx_MinTh = Default(MnMx_MinTh,Thresh) MnMx_MaxTh = Default(MnMx_MaxTh,Thresh)
Lo = Default(Lo,128) Hi = Default(Hi,255)
CMad = Default(CMad,1)
MskFunc = Default(MskFunc,4) MskLoTh = Default(MskLoTh,0.0) MskHiTh = Default(MskHiTh,127.5) MskInColY = Default(MskInColY,0) MskOutColY = Default(MskOutColY,255)
# Zebra Args COLUMN (default as for ROW)
MinTh2 = Default(MinTh2,MinTh) MaxTh2 = Default(MaxTh2,MaxTh)
MnMx_MinTh2 = Default(MnMx_MinTh2,MnMx_MinTh) MnMx_MaxTh2 = Default(MnMx_MaxTh2,MnMx_MaxTh)
Lo2 = Default(Lo2,lo) Hi2 = Default(Hi2,Hi)
CMad2 = Default(CMad2,CMad)
MskFunc2 = Default(MskFunc2,MskFunc) MskLoTh2 = Default(MskLoTh2,MskLoTh) MskHiTh2 = Default(MskHiTh2,MskHiTh) MskInColY2 = Default(MskInColY2,MskInColY) MskOutColY2 = Default(MskOutColY2,MskOutColY)
### Common args
SubsI = Default(SubsI,True) SubsO = Default(SubsO,SubsI)
###### If (BandCnt>0) then Proc Zebra
Assert(0 < FuncMap <= $FF,RT_string("%s0 < FuncMap($%X) <= $FF",myName,FuncMap))
BandCnt = RT_BitSetCount(FuncMap)
RowC=Last.Zebra(threshold=Thresh,matrix=Matrix,row=TRUE,lo=Lo, hi=Hi, cmad=CMad, pix=PIX,minTh=MinTh, maxth=MaxTh, MnMx_MinTh=MnMx_MinTh, MnMx_MaxTh=MnMx_MaxTh, funcMap=FuncMap,
\ MskFunc=MskFunc,MskLoTh=MskLoTh,MskHiTh=MskHiTh,MskInColY=MskInColY,MskOutColY=MskOutColY)
ColC=Last.Zebra(threshold=Thresh,matrix=Matrix,row=FALSE,lo=Lo2,hi=Hi2,cmad=CMad2,pix=PIX,minTh=MinTh2,maxth=MaxTh2,MnMx_MinTh=MnMx_MinTh2,MnMx_MaxTh=MnMx_MaxTh2,funcMap=FuncMap,
\ MskFunc=MskFunc2,MskLoTh=MskLoTh2,MskHiTh=MskHiTh2,MskInColY=MskInColY2,MskOutColY=MskOutColY2)
RowC=(SubsO)?RowC.SUBTITLE("Row\nTrue",Align=5,lsp=0):RowC
ColC=(SubsO)?ColC.SUBTITLE("Row False",y=(ColC.Height+12)/2.0,Align=5):ColC
S1="" S2=""
if(SubsI) {
S1=RT_String("FuncMap=$%02X CMad=%d%s\n",FuncMap,CMad,c.IsRGB?String(Matrix," Matrix=%d"):"")
if(RT_BitAnd(FuncMap,$03)!=0) { S1=RT_String("%sMinTh=%.2f MaxTh=%.2f\n",S1,MinTh,MaxTh) }
if(RT_BitAnd(FuncMap,$04)!=0) { S1=RT_String("%sMnMx_MinTh=%.2f MnMx_MaxTh=%.2f\n",S1,MnMx_MinTh,MnMx_MaxTh) }
if(RT_BitAnd(FuncMap,$20)!=0) { S1=RT_String("%sLo=%d Hi=%d\n",S1,Lo,Hi) }
if(RT_BitAnd(FuncMap,$80)!=0) { S1=RT_String("%sMskFunc=%d(%s) MskLoTh=%.2f MskHiTh=%.2f\n",S1,MskFunc,OpName(MskFunc),MskLoth,MskHith) }
###
if(CMad!=CMad2) { S2=RT_String("%sCMad2=%d\n",S2,CMad2) }
if(RT_BitAnd(FuncMap,$03)!=0&&(MinTh!=MinTh2||MaxTh!=MaxTh2)) { S2=RT_String("%sMinTh2=%.2f MaxTh2=%.2f\n",S2,MinTh2,MaxTh2) }
if(RT_BitAnd(FuncMap,$04)!=0&&(MnMx_MinTh!=MnMx_MinTh2||MnMx_MaxTh!=MnMx_MaxTh2)) { S2=RT_String("%sMnMx_MinTh2=%.2f MnMx_MaxTh2=%.2f\n",S2,MnMx_MinTh2,MnMx_MaxTh2) }
if(RT_BitAnd(FuncMap,$20)!=0&&(Lo!=Lo2||Hi!=Hi2)) { S2=RT_String("%sLo2=%d Hi2=%d\n",S2,lO2,Hi2) }
if(RT_BitAnd(FuncMap,$80)!=0&&(MskFunc!=MskFunc2||MskLoth!=MskLoth2||MskHith!=MskHith2)) { S2=RT_String("%sMskFunc2=%d(%s) MskLoTh2=%.2f MskHiTh2=%.2f\n",S2,MskFunc2,OpName(MskFunc2),MskLoth2,MskHith2) }
}
S = (S2!="") ? RT_String("%s\n%s",S1,S2) : S1
Lines=RT_TxtQueryLines(S) Y=(Height-Lines*18) / 2 S=S.RT_StrReplace(Chr(10),"\n")
(SubsI) ? SubTitle(S,Align=5,Y=Y,lsp=0) : NOP
BLANK=(ColC.IsClip)?ColC.BlankClip(width=RowC.Width,color=$808080):0
Blank=(Blank.IsClip&&SubsO)?Blank.BandSub(FuncMap,BandCnt):Blank
Return (Blank.IsClip)?StackVertical(StackHorizontal(RowC),StackHorizontal(ColC,BLANK)):Last
}
/*
# Demo Equid Client
#Import(".\Equid.avsi") # Use GImport() if GScript, Else Import()
#GImport(".\Equid.avsi")
###############
#AVISource("D:\Parade.avi")
Colorbars
###############
### WE DO NOT provide individual threshold args, you can add them to the function call if required.
### Also, We do not provide ROW=False(coloumn,mode) args to the function call, add them yourself if you wish [they default to same as Row=True args].
###############
Thresh = 0.0 # Set all MinTh, MaxTh, MnMx_MinTh and MnMx_MaxTh to Thresh.
FuncMap = $FF # All 8 Bands.
Matrix = 2 # 0=rec601, 1=rec709, 2=pc601, 3=pc709
Lo = 128 # Band 5 (YInRange)
Hi = 255 # Ditto
CMad = 1 # Centered Moving Average Diameter (Can be even)
MskFunc = 4
MskLoTh = 68.0
MskHiTh = 100.0
MskInColY = 0
MskOutColY = 255
SubsI=True
SubsO=True
#ConvertToY8(Matrix="pc601")
#ConvertToYV12(Matrix="pc601")
Equid(Thresh=Thresh,FuncMap=FuncMap,Matrix=Matrix,lo=Lo,hi=Hi,CMad=CMad,mskFunc=MskFunc,MskLoth=MskLoth,MskHith=MskHith,MskInColY=MskInColY,MskOutColY=MskOutColY,SubsI=SubsI,SubsO=SubsO)
Return Last
*/
Cmad = 1
https://i.postimg.cc/TpsddBCx/Equid-Client-00.jpg (https://postimg.cc/TpsddBCx)
CMad=15
https://i.postimg.cc/mPMsbkP3/Equid-Client-01.jpg (https://postimg.cc/mPMsbkP3)
Live video CMad = 1
https://i.postimg.cc/4HkJvcH3/CMad1.jpg (https://postimg.cc/4HkJvcH3)
Live video CMad = 15
https://i.postimg.cc/LYHdmVPL/CMAd15.jpg (https://postimg.cc/LYHdmVPL)
EDIT: MskFunc adapted from this post:- http://forum.doom9.org/showthread.php?p=1886301#post1886301
EDIT: Damn, fixed below in posted Equid.avsi, not fixed in zip.
# Assert(FuncNameExists("RT_Stats"),RT_String("%sNeed RT_Stats",myName)) # EDIT: Crap, cant use RT_String()
Assert(FuncNameExists("RT_Stats"),myName+"Need RT_Stats")
StainlessS
12th October 2019, 01:39
WARNING, just in case somebody is gonna do summick clever with current Zebra, is likely gonna have an additional band inserted before the current band 7(MskByRow, recently added).
Maybe new band something like fuzzy logic on active/selected bands [0->6], eg Min, Max, Min-Max, Median, Ave, of selected bands.
Min is kinda like AND, max is kinda like OR, not sure what the others are kinda like, but might be useful.
MskByRow will move to band 8, with similar functionality to current but with 1 extra band to choose from.
Same kinda functionality is likely gonna be added to Zebroid, but still not 100% sure how yet.
Anyways things are gonna change a bit, hence the post.
EDIT: Arg Order will also likely change. Also likely no further bands added.
EDIT:
New Min_AND op will not likely be useful on band 0(Min Band) unless other selected bands include Max-Min, Yir, or Stdev band. [unless very high MinTh setting used]
New Max_OR op will not likely be useful on band 1(Max Band) unless other selected bands include Yir, or possibly but unlikey Stdev band. [unless very high MaxTh setting used]
New ops will be most of use when Yir band is selected together with other selected bands to 'pick out' points of interest from the non Yir band. [tweaking with Yir(lo,hi)]
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.