Image konvertieren in monochrom scharz/weiß

Status
Nicht offen für weitere Antworten.

okin

Mitglied
Hallo Zusammen,

ich möchte Farb TIF´s und/oder JPG´s in monochrome schwarz/weiß Bilder konvertieren.

Mittels JAI habe ich es geschafft Images in Graustufenbilder zu wandeln.
Das hilft mir leider nicht, dar über die Images anschließend eine nachgelagerte OCR-Erkennung laufen soll, und diese schwarz/weiß Images voraussetzt.

Hier der Code, mit dem ich erfolgreich das Graustufenimage erzeugen konnte.
Vielleicht lässt sich hier drauf aufbauen.


Code:
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;

import javax.imageio.ImageIO;

public class GrayScaleConversionExample {

    public static void main(String[] args) throws Exception {
        BufferedImage src = ImageIO.read(new File("C:\\temp\\7a8b282a.jpg"));
        BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
        ColorConvertOp grayScaleConversionOp = new ColorConvertOp(ColorSpace
                .getInstance(ColorSpace.CS_GRAY), null);
        
        grayScaleConversionOp.filter(src, dest);
        ImageIO.write(dest, "jpeg", new File("C:\\temp\\7a8b282a_grau.jpg"));

    }

}

Ein verzweifelter Newbie ;-)
 
Schwellwert festlegen und alles was dunkler ist schwarz machen und was heller ist weiß.

P.S.:
Sind die Bilder 3D 😉
 
OK, aber wie realisiere ich das?

Ein Beispiel würde mir bestimmt helfen.
Den Schwellwert kann ich anschießend selbst austesten.

Bei den Images selbst handelt es sich um ganz normale 2D Images, welche zuvor mit einen Flachbettscanner gescannt worden sind.

Sorry, aber mir fehlt da jeglicher Ansatz, wie ich das umsetzen kann.
 
Ich habe nun doch eine Lösung gefunden, um ein TIFF-Image in monochrom umzuwandeln.

Jedoch hat sich für mich auch gleich ein weiteres Problem aufgetan.

Doch zuerst mal der Code, mit dem es funktioniert:


Code:
import java.awt.image.renderable.ParameterBlock;
import java.io.IOException;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.TIFFEncodeParam;
import javax.media.jai.PlanarImage;
import javax.media.jai.Histogram;

public class JAISampleProgram16 {

		public static void main(String[] args) throws IOException {
		
			String outputFile = "C:\\temp\\finalash.tif"; 
		
		
			/*
			* Create an input stream from the specified file name
			* to be used with the file decoding operator.
			*/
			FileSeekableStream stream = null;
			try {
				stream = new FileSeekableStream( "C:\\temp\\7a8b282a.jpg" );	
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			/* Create an operator to decode the image file. */
			RenderedOp sourceImg = JAI.create("stream", stream);
			
			// Create a ParameterBlock and specify the source and
			
			/* Get the width and height of image2. */
			int w = sourceImg.getWidth();
			int h = sourceImg.getHeight();
			System.out.println(w +"*"+h);
						
			// typical weights for converting RGB to Grayscale
			// gray = 0.3*red + 0.59*green + 0.11*blue
			double[][] matrix = {{ 0.3D, 0.59D, 0.11D, 0D }};
			ParameterBlock pb = new ParameterBlock();
			pb.addSource(sourceImg);	
			pb.add(matrix);
			PlanarImage src = JAI.create("BandCombine", pb, null);
			
			// Generate a histogram.
			Histogram histogram = (Histogram)JAI.create("histogram", src).getProperty("histogram");
			
			// Get a threshold equal to the median.
			double[] threshold = histogram.getPTileThreshold(0.5);
			
			// Binarize the image.
			PlanarImage dst = JAI.create("binarize", src, new Double(threshold[0]));
			RenderedOp im = JAI.create("format", dst);
			
			TIFFEncodeParam param = new TIFFEncodeParam();
			param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
			
			try {
				//JAI.create("filestore", im, outputFile, "BMP", null);
				//JAI.create("filestore", im, outputFile, "jpeg", null);
				JAI.create("filestore", im, outputFile, "tiff", param);
			}catch(Exception e){
				System.out.println("Error:"+e);
			}//try catch ends
		
		}//main ends
}//class ends


Klappt prima, solange ich keine MultiPage-Tiffs verwende.
Hat jemand eine Idee, wie Multipage-Tiffs verwendet werden?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben