A "slanted edge" analysis program



Well, my Imatest trial is up, and I'm not going to buy it (though it is a very nice program that I'd recommend!), but I'd still like to play with ESF, PSF, MTF and all that.
Specifically, I'm still very interested in findout out what the "best sharpening" for my scanner is by analysing the edge spread function.


There is another interesting "slanted edge tester" at http://www.i3a.org/downloads_iso_tools.html (if I'm not mistaken, Imatest is actually based on its code), but it doesn't give nearly as much information as Imatest does... even though perhaps the MTF alone could be turned into the correct deconvolution for my scanner in the hands of "some of the people here"! ;-)


But. In the last few days I've been busy writing my own "slanted edge" program. It now sort of works, meaning that it doesn't (often) crash, and that it gives results that are similar to what Imatest or SFRWin give.
Similar, not really identical... that's why I would be glad if Bart, Kennedy, or anybody who's into this kind of things could help me a little.



The program can be found at http://ljl.150m.com/slantededge-alpha1.tar.gz

and I've created a SourceForge project at
  http://sourceforge.net/projects/slantededge/

with sourcecode in the CVS.


I'll explain briefly what the program does and in what order it does it, as the source is not very well commented, er, at the moment.


1) Read in an RGB image
2) We work with vertical edges, so rotate the image if needed
3) Besides the "red", "blue" and "green" channels, create a "gray" channel that is the average of the other three
4) Normalize the image, so that 0.5% of the pixels clip down, and 0.5% clip up
5) For each line in the image, find the point with the max adjacent pixel difference (should be the edge)
6) By doing a least squares regression on those points, find a straight line that ought to best represent the edge
7) Associate a distance from that line to each pixel in the image. The function PixelValue(Distance) approximates the edge spread function.
8) Use "some kind" of local regression to create a uniformly-spaced version of the ESF, from the data described above.
9) Derive the line spread function from the edge spread function: LSF(i)=ESF(i+1)-ESF(i)
10) Apply a Hanning window to the LSF
11) Take the discrete Fourier transform or the resulting data



Note that, at the moment, the input image must be an RGB, 8-bit ASCII ("plain") PPM file. These can be created using "*topnm" and "pnmtoplainpnm" from the NetPBM suite, or by using the GIMP.
Type --help for some uncomprehensive help.



I have a lot of doubts and questions to ask, but first I'd like to get an overall look at the program by someone competent, to find out what I have done *badly* wrong (something awful is bound to be there).


Please keep in mind that I knew nothing about regressions, spread functions or Fourier transforms two weeks ago -- and I suppose I don't know that much more now.
I just read some Internet source and implemented what I thought they meant.



by LjL ljlbox@xxxxxxxxxx .