Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Since I don't have a copier or scanner, I'm using an 8 megapixel camera to copy documents. This works pretty well except they need a lot of processing afterward. I'd like to get from a photo to a bitmap, but using

djpeg -grayscale -pnm photo.jpg |
pgmtopbm -threshold -value XXX

does not work so well, for two reasons:

  1. It's hard to guess what XXX should be, and XXX is different for different photos.

  2. Illumination varies, and sometimes a single threshold isn't what's right for the image.

How can I do better? The ideal solution will be fully automatic command-line program that I can run on Linux. (I have already written a program to remove dark pixels from the edges of images.)

NOTE: I really want a bitmap, that's just black and white pixels. No grayscale, no dithering.

share|improve this question
Similar question here:… – Simon East Aug 2 '10 at 4:02

convert -monochrome from ImageMagick is an option that uses some smart dithering to produce great output for human consumption:

convert -monochrome in.png out.png

For example, starting from this Andromeda picture:

enter image description here

-monochrome gives:

enter image description here

while a simpler -threshold 50 transform loses the entire image:

enter image description here

share|improve this answer

The best thing I've found in three years is the mkbitmap program that ships with potrace.

share|improve this answer

Apparently, Gimp supports some command-line batch processing. You might be able to give that a shot, since desaturating will probably behave like you'd expect with varying brightness in your images.

share|improve this answer
I'd be happy to try it; can you suggest which among the many hundreds of GIMP transformations might be relevant? – Norman Ramsey Nov 27 '09 at 22:42

Check out your camera. Many modern digital cameras have the ability to take B&W photos directly.

share|improve this answer
I'm looking for bitonal, not greyscale. – Norman Ramsey Nov 27 '09 at 22:41

Converting to grayscale / desaturating will preserve most of the noise too. The GIMP has a Threshold filter (under the Color menu) that eliminates the noise, and works very well for line-art and plain black scanned text.

I'm not too clued up on the batch scripting myself, but it sounds like a good idea to use the Threshold with it.

Edit: Since you have Linux as a tag, have a look at Phatch, batch photo manipulations. It has filters to adjust the contrast and brightness too. It's in the Ubuntu repos (if you use that distro)

share|improve this answer
OK, I checked out Threshold, and it does exactly what pgmtopbm does. If I wanted to adjust each page by hand, it would be great, but I really don't. At it completely doesn't solve the problem that I really need different thresholds in different parts of the image. Still, yours was the answer that most closely identified what GIMP can and can't do, so +1. P.S. It took me several minutes to find the thing among the goddamned menus. – Norman Ramsey Nov 27 '09 at 22:48
Apart from eyeballing the image, I can't say how to calculate the threshold values per image. Wow I'm stumped. Perhaps auto-adjusting the light levels first will put all images on the 'same level', and a common threshold value will then work? – invert Nov 30 '09 at 11:11

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.