Author: Michael Minn (see michaelminn.com for current address)
January 15, 2005
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:
v2005-01-15: mmsuper8 broken into separate utility programs
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.
![]() |
![]() |
![]() |
mmsuper8frame takes as input scans of super 8 film in pnm files that are strips of frames oriented top to bottom and have ONLY white area to the left and right of the film scan (for edge and sprocket hole detection).
mmsuper8frame 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.
mmsuper8frame outputs sequentially numbered PNM files with one file for each frame (e.g. frame00000.pnm, frame00001.pnm, etc.)
You should try a few sample scans before putting in the effort to scan a whole roll of film.
mmsuper8frame [options] scan_file.pnm ... -b Output will be black and white (i.e. grayscale) (default is color) -resolution dpi Specifies image resolution for frame sizing based on dimensions of standard super8 film. Should be specified even if automatic frame detection is overridden. (default is 1200) -clipleft pixels -clipright pixels -cliptop pixels -clipbottom pixels Crops a given number of pixels from left/right/top/bottom of each frame These values can be negative. -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 pixels 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 pixels 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. -frameheight pixels Specifies distance between each frame (used with -frameoffset to override automatic frame detection) -frameoffset pixels Specifies top starting point for frame extraction (used with -frameheight to override automatic frame detection) -framenumber number Starting number for output files (default is 00000)
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.
mmsuper8frame 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.
mmsuper8frame -nosprocket -frameoffset 280 -frameheight 397 -framefromright -clipright 20 -clipleft 20 -resolution 2400 2400_strip.pnm
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.
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:
Although mmsuper8frame will converting scan strips to individual frame files for editing or archiving, the final viewable product will need to be some video format. mmsuper8mov can be used to combine frame files into uncompressed Quicktime files:
mmsuper8mov [options] frame_file ... -o output_file Specifies name of output file (default is movie.mov) -b Output file should be black-and-white (i.e. grayscale) -rate fps Specifies frame rate (default is 18 bps)
The example below 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.
mmsuper8 frame*.pnm -resolution 2400 -o final_movie.mov
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.
.mov files can be played with lqtplay, a simple player that is part of the libquicktime package. The .mov files do not play on mplayer.
RealProducer can import uncompressed .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 movie.mov -o movie.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.
mmsuper8avi combines .ppm/.pgm/.pnm frame files into a single uncompressed .avi movie file. Strips of frames MUST first be separated into single-frame files with mmsuper8frame.
mmsuper8avi - Combines .ppm/.pgm/.pnm frames into a single uncompressed .avi movie file mmsuper8avi [options] framefile... -o output_file Specifies name of output file (default is movie.avi) -b Output file should be black-and-white (i.e. grayscale) -rate fps Specifies frame rate (default is 18 bps)
On Linux, the .avi players play with 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.
mmsuper8list performs a list of the chunks (.avi) or atoms (.mov) in a video file. This utility was part of my work figuring out how to create .avi and .mov files is provided for diagnosing problems or examining the content of existing .avi or .mov files.
mmsuper8normalize normalizes colors in frame files.
With no options, mmsuper8normalize simply finds the high and low values for each color and redistributes the intensity values across the given range. This usually improves the saturation and color balance for old films with faded colors and scans with poor levels. However, this can introduce additional flicker since normalization will be affected by dust, scratches and inconsistencies in scanner source light over the length of a scan.
Specific min/max values can be specified for each color. Optimal settings can be determined by trial and error or by experimenting on a single frame with the levels color tool in Gimp.
Finally, after color correction, a new midpoint for luminance distribution can be specified. This effectively lightens or darkens the final image.
mmsuper8normalize [options] frame_file ... -red min max Overrides automatic detection of min/max red color values -green min max Overrides automatic detection of min/max red color values -blue min max Overrides automatic detection of min/max red color values -mid midpoint Specifies midpoint for adjusting luminance after normalization
mmsuper8deflicker adjusts luminance midpoint on a series of frame files so each frame has the same average overall luminance. Scanners and scanning light sources are rarely even across the length of a strip of film. This utility may not be very effective with groups of frames with large amounts of motion or widely changing levels of darkness.
mmsuper8deflicker [-l red green blue gray] frame_file ... -l specify desired luminance values (do not compute an average from all frames)
Luminance values (if specified) are 0 - 255. You can find the luminance of a frame you like by running mmsuper8deflicker on that frame and reading the values printed by the program. Those values can then be applied to the rest of the frames.
mmsuper8jitter adds jitter, flicker and grain to a sequence of frame files to create the illusion of an early 20th century film. 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.
mmsuper8dejitter 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. mmsuper8dejitter - Uses correlation to remove interframe jitter. Best on frames with limited motion.
mmsuper8dejitter max_shift pnmfile1 pnmfile2 ... max_shift is in number of pixels.