%ffp //------------------------------------- // FM_TEMPLATE_1 //------------------------------------- Category: "AstroPlugins" Title: "Artificial Flat" Copyright: "Copyright ©2005 Author: "James Ryan" Organization: "Astroplugins" Filename: "Artificial flat" Description: "" Version: "v1.0" URL: "www.grekalova.com" About: "AstroPlugins !V\n" "!c\n!A\n!U" Dialog: Text = "Astroplugins Artifical Flat !V !c !A" //------------------------------------- SupportedModes: GrayScale //------------------------------------- ctl[00]: "Segments", val = 20, range=(4,50), tooltip="Default 2" ctl[01]: "Reject Star", val = 4, range=(1,8), tooltip="Default 2" ctl[02]: "Sigma ", val = 10, range=(0,50), tooltip="Default 2" // ctl[02]: CHECKBOX, "CHECK", Action=NONE, val = 00, tooltip="Default No" // ctl[6]: "count", val = 0, range=(0,255) OnFilterStart: { // Info("%d",imageMode); if( imageMode != 1) { ErrorOk("This filter only works on Grayscale 8bit images."); doAction(CA_CANCEL); } return false; }//OnFilterStart //------------------------------------- // ForEveryTile //------------------------------------- ForEveryTile: { int count, counter, reject, ave,ave1,sigmareject,sigmareject1; float sigma, sigmarun,fave1; int i,j,k; int minval, lastmin, interval; int xval,yval, ix, iy, ixval,iyval, yseg,xseg; bool check; //------------------------------------- // Initialize variables //------------------------------------- interval = ctl(0); reject = ctl(1); sigmareject = ctl(2); sigmareject1 = (float) sigmareject/10; counter = 0; count = ctl(6); xseg = X/ctl(0); yseg = Y/ctl(0); xval = X/xseg; yval = Y/yseg; iy = 0; ix = 0; for (iyval = 0; iyval < yseg + 1; iyval++) { for (ixval = 0; ixval< xseg + 1; ixval++) { j = 0; ave = 0; for (y= iyval * yval; y < iyval * yval + yval; y++) { for (x = ixval * xval; x < ixval * xval + xval; x++) { k = src(x,y,0); ave = ave + k; j = j + 1; } } ave = ave/j; ave1 = 0; j = 0; for (y= iyval * yval; y < iyval * yval + yval; y++) { for (x = ixval * xval; x < ixval * xval + xval; x++) { k = src(x,y,0); if (k < ave + reject) { ave1 = ave1 + k; j = j+1; } } } ave1 = ave1/j; j = 0; sigmarun = 0; for (y= iyval * yval; y < iyval * yval + yval; y++) { for (x = ixval * xval; x < ixval * xval + xval; x++) { k = src(x,y,0); if (k < ave1 + reject) { sigmarun =(k-ave1) * (k-ave1) + sigmarun; j = j+1; } } } sigma = (sqrt(sigmarun / j +1)); //if (counter < count){ Info("sigma %f %f %d %d",sigma,sigmarun,j,ave1);counter = counter +1;} for (y= iyval * yval; y < iyval * yval + yval; y++) { for (x = ixval * xval; x < ixval * xval + xval; x++) { minval = src(x,y,0); // if (y = Y && x = X){ Info("ave1 %d %d %d %d",x,y,minval,ave1);counter = counter +1;} if ( abs (minval - ave1) < sigmareject1 * sigma || minval < ave1) { pset (x, y , 0, minval); }else { pset (x, y, 0,ave1); } } } } if (updateProgress(y,Y)) abort(); }//end iyval return true; }//ForEveryTile