Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .