Author: Michael Minn (see michaelminn.com for current address)
July 25, 2004
The following page provides instructions and tips for creating digital video files from super 8 film scanned with a flatbed scanner. While the quality is poorer than that achieved with a professional telecine machine, it is acceptable for casual viewing and archiving of super 8 home movies and commercial prints.
There are numerous advantages and disadvantages to this approach.
There are a few other pages on the web provided by other people who have tried flatbed scanning of super8 film:
v2004-07-25: Debut beta release to the public.
![]() Sample scan from a commercial print |
The challenge with scanning is to find a physical setup that will hold the film steady in the scanning area and make it possible to quickly advance the film between scans. As the interface between the computer and the physical world with inadequate equipment, scanning is the most problematic part of the process.
Scanner: The scanner itself should be at minimum capable of 1200 dpi OPTICAL scan resolution (not interpolation from a lower resolution) with 2400 or 3600 even better (but slower). I use an Epson Perfection 2400, a USB scanner supported under Linux and providing 2400 DPI resolution.
Light Source: You will need some sort of diffuse light source to backlight the film. Scanners that have transparency adapters built into their covers usually place them in the same orientation as the scanner glass. Although the results MAY be more accurate, scanning a high resolution lengthwise (using only a small portion of the scanning platen) is MUCH slower than scanning sideways (using the full length of the scanning platen). Therefore, some way of back illuminating the film must be found. I use an old freestanding HP ScanJet HPA transparency adapter that I purchased on ebay. To hold the film down on the glass, I remove the diffuser and light unit from the case to press the film against the glass. Finding something that will provide a consistent light source is difficult.
Film Guide: While the mmsuper8 software detects sprocket holes and crops individual frames, some kind of guide is needed to place the film in a consistent place on the glass and facilitate pulling an appropriate number of frames through between scans without and undue number of dropped or duplicated frames. Using foam mounting tape, I created guides on each side of the scanner. As noted above, scans are performed sideways, which is much faster than scanning lengthwise.
![]() |
![]() |
![]() |
Scanimage Script: SANE (the Linux Scanner support package) provides the command line scanimage utility for controlling scanners. This permits using a script to control scanning and reduce the number of mouse actions and keystrokes that must be performed for each scan. This will require some tweaking for your individual situation to reduce the scanned area to the minimum area needed to capture as many frames as possible. The example given below also uses the pnmflip command since the film is scanned sideways, but mmsuper8 requires strips of frames that are oriented top to bottom.
index=0 while true; do filename=`printf "%03d.pnm" $((index))` echo "pressto scan" $filename read scanimage --resolution 1200 -l 15 -t 11 -y 11 -x 185 --mode Color > temp.pnm pnmflip -rotate270 temp.pnm > $filename rm temp.pnm index=$((index+1)) done exit
Although it is usually impossible to get the scanner to run without the scanner lamp on, this does not adversely affect the quality of most well-exposed film, provided that there is a consistent light behind the transparency. Dirt and scratches on underexposed film will reflect light, causing the defects to be light colored in the scan.
Scanners with built-in transparency adapters detect the presence of the adapter, so you can't use the transparency setting if the lid has been removed. Also they usually limit the scanning dimensions to the area convered by the transparency adapter, and as stated above, lengthwise scanning of super 8 film at high resolution is prohibitively slow.
To detect edges successfully, mmsuper8 requires that the scan strips be oriented top to bottom and that the left and right areas in the scan be white. The image should also be cropped so that the frames are usable from top and bottom.
With my physical setup, each scan captures around seven inches (40 frames - around two seconds) and takes about a minute. At this rate, I can scan a 50-foot roll in around an hour.
mmsuper8 takes as input scans of super 8 film in pnm files. Files may contain single frames or strips of frames that are oriented top to bottom and have ONLY white area to the left and right of the film scan (for edge and sprocket hole detection).
mmsuper8 takes as input one or more pnm files. PNM is an extremely simple, uncompressed format that is the output of the scanimage program. While this format consumes a significant amount of space (around 200K/frame at 2400DPI), it is extremely easy to read, does not use lossy compression, and should be readable in the future when proprietary format algorithms have been long forgotten.
mmsuper8 can output individual PNM frame files, an uncompressed RGB AVI file or an uncompressed .mov (Quicktime) file. Also note that mmsuper8 can be used to combine individual PNM frame files into an .avi or .mov file later, but there is currently no utility to extract individual frames from a .mov.
You should try a few sample scans before putting in the effort to scan a whole roll of film.
mmsuper8 [options] scan_file.pnm ... -o [.avi file] | [.mov file] Sends output to uncompressed .avi or .mov (Quicktime) file. By default, output goes to sequentially numbered PNM files with one file for each frame (e.g. frame00000.pnm, frame00001.pnm, etc.) -n Normalizes colors. Usually improves the saturation and color balance for old films with faded colors and scans with inadequate gamma correction. However, this can introduce additional flicker since normalization will be affected by dust, scratches and inconsistencies in scanner source light over the length of the scan -resolution [dpi] Sets input file resolution to given DPI. Default is 1200 -l [input_file] Lists the chunks (.avi) or atoms (.mov) in the given file. Does not do any further processing and stops after list. This feature is provided for diagnosing problems or examining the content of existing .avi or .mov files -rate [fps] When output file is given, sets the display rate in frames per second. Default is 18FPS (silent film standard) -b Output files are converted to grayscale. -h Prints this syntax message -clipleft [pixels] -clipright [pixels] -cliptop [pixels] -clipbottom [pixels] Clips the given number of pixels from the edge of the output frame. These values can be negative. Used for cropping. -framenumber [number] When output is going to separate files (not .avi or .mov), this sets the starting number used for the file names. Default is 00000 -nosprocket Turns off sprocket hole detection and assumes the top of the first frame is the top of the input image(s) and that subsequent frames follow at exactly the appropriate frame height for the given resolution. Useful for scans of commercial prints where sprocket holes are not detectable in the scan. -frameoffset [number] When not using sprocket hole detection, the top of the first frame is assumed to start at the very top of the scan file. This parameter can be used when the first frame should start at a lower location. Value is in pixels and can only be positive. Note that this parameter turns off sprocket hole detection. -frameheight [number] When not using sprocket hole detection, variation in scanner accuracy will cause frame drift. This parameter can be tweaked to adjust the spacing between frames. Values are in pixels. Default is 200 at 1200 DPI. This parameter turns off sprocket hole detection: -cliptop and -clipbottom should be used for adjusting framing and/or modifying the size of the output frame. -framefromright -framefromleft Normally a dark left edge is assumed for finding the horizontal location of a frame. This should also work for commercial prints that have clear sprocket area since the detected width will be less than 8mm and the left edge is adjusted accordingly. However, some commercial prints are framed so the picture area abuts the clear sprocket area. If the content of the picture is light, there will be no left edge to detect and horizontal framing will be incorrect. In those cases, there may be a dark right border which can be used. -framefromright causes usage of the right border for framing. The default is framing from the left and -framefromleft can be used to restore left framing if -framefromright was given for a previous file in a list of input files. -sprocket Turns sprocket hole detection back on if -nosprocket was given before a previous input file.
Examples:
Home Movies: Home movies normally have emulsion covering the entire width of the film and therefore have white sprocket holes against a black background. In this scenario, when given the correct resolution, mmusuper8 should be able to detect sprocket holes and create frame files without any additional parameters. Multiple input strip files can be included with each invocation of mmsuper8. The following invocation assumes the strip files are scanned at 1,200 DPI and will create a sequence of files named frame00001.pnm, frame00002.pnm, etc.
mmsuper8 strip001.pnm strip002.pnm strip003.pnm
Commercial Print: Commercial super 8 prints often have emulsion only in the frame area of the film. Therefore, the sprocket area is clear and mmsuper8 is incapable of detecting sprocket holes. Complicating matters, the printed image may not be correctly centered in the frame area, making it impossible to detect the left edge of the film. In these cases, specific framing information FOR EACH STRIP FILE must be given.
mmsuper8 -nosprocket -frameoffset 280 -frameheight 397 -framefromright -clipright 20 -clipleft 20 -resolution 2400 2400_strip.pnm -o temp.mov
The example above works with this brief sample strip. Note that this strip is in PNG format to save server space since PNM files are quite large. It needs to be converted from PNG to PNM with gimp or some other image processing utility. An brief example of this strip converted to a movie (in RealVideo format) is given here.
Converting Frames to Quicktime: Although it is useful for initially converting scan strips to individual frame files for editing or archiving, the final viewable product will need to be some video format. mmsuper8 can be used to combine frame files into uncompressed Quicktime files:
mmsuper8 frame*.pnm -resolution 2400 -o final_movie.mov
The example above uses a wildcard to specify multiple frame files. If the frame files are anything other than 1200 DPI, -resolution must be specified. There appears to be a size limit on .mov files (that mmsuper8 does not detect), which limits the size of uncompressed movies created with high-resolution files to only a few seconds. In those cases, it is probably best to create a multiple short .mov files, combine them with some video editing software and then save the composite file in a compressed format that uses space more efficiently.
The mmsuper8 package include mmsuper8play, a simple X-Windows player for playing individual PNM frame files. Since this reads files on demand and does not attempt to sync with the refresh rate of the display, playback rate is inaccurate and unstable. However, it is useful for previewing and editing frame content prior to conversion to .mov or .avi. mmsuper8play uses the following keystrokes:
On Linux, the .avi players play with mplayer. The .mov files play with lqtplay, a simple player that is part of the libquicktime package. The .mov files do not play on mplayer.
Although they conform to the published file formats, the video output files created by mmsuper8 do not play on the Windoze media player (.avi), Widoze Quicktime player (.mov) or the RealPlayer on any platform. Players on Windoze are closed source and the error messages issued by the players are too inspecific to diagnose the problem further.
RealProducer can import .mov files and output compressed .rm files that can be streamed on the internet. You can download a Linux tarball from the Real.com website.
realproducer -i foo.mov -o foo.rm -t 8 -f 0 -b "Title" -h "Author" -c "(c) 2004 by Author"
I assume that digital video editing software can import .mov or .avi files, although I have never tried.
MMSUPER8 contains two utility programs for modifying frame files. Both these utilities operate on separate frame files, not a single strip containing multiple frames. Neither utility is fully developed.
mmsuper8stabilize removes inter-frame jitter and flicker. It works by performing correlation between frames and shifting frames to achieve maximum correlation. As such, it is really only useful on scenes that are largely static. It also most effective only when used on frames that constitute a single scene; it should not be run on frames that constitute multiple scenes. It does not crop the edges which will will look strange with extraneous material.
mmsuper8stabilize max_shift pnmfile1 pnmfile2 ... max_shift is in number of pixels.
mmsuper8jitter adds jitter, flicker and grain to a sequence of frame files to create the illusion of an old movie. This should be used on files with individual frames, NOT scan files that contain strips of frames.
mmsuper8jitter [options] [pnmfile1 pnmfile2 ...] -jitter (pixels) Simulates worn sprocket holes which cause steady images to jitter slightly. Specifies the maximum value for random frame position shift between frames. Default is 1 pixel. Larger values look more like an earthquake than jitter. Value of 0 turns off this effect. -flicker (level) Simulates random variability in image intensity caused by inconsistent film sensitivity and inconsistent frame exposure times. Specifies a maximum value for random intensity value added to each frame, assuming 8-bit images with an intensity range of 0 - 255. Default is 16. Value of 0 turns off this effect. -grainlevel (grain level) -graincount (grain count) Simulates film grain by adding random points of intensity to the image. Specifies the maximum intensity of each point (assuming 8-bit depth). Default level is 12 and default count is width * height * 2.