Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Re: Image Thinning using JAVA

Reply
Thread Tools

Re: Image Thinning using JAVA

 
 
Knute Johnson
Guest
Posts: n/a
 
      06-26-2012
On 6/26/2012 9:50 AM, sumera wrote:
> Hi!
> I have written some code in java to convert a colored image into black and white image and then tried to perform thinning on that gray-scale image. Black and white conversion is done successfully, but image thinning is still not giving correct output. Kindly help me in fixing my problem. My code is as follows:
>
> //colored image to black and white conversion; black and white image to thinned image.
>
> public static void main(String[] args)
> {
> try
> {
> //colored image path
> BufferedImage colored_image = ImageIO.read(new File("D:\\logo.jpg"));
> //getting width and height of image
> double image_width = colored_image.getWidth();
> double image_height = colored_image.getHeight();
> BufferedImage img = colored_image;
>
> //drawing a new image
> BufferedImage bimg = new BufferedImage((int)image_width, (int)image_height, BufferedImage.TYPE_BYTE_GRAY);
> Graphics2D gg = bimg.createGraphics();
> gg.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);
>
> //saving black and white image onto drive
> String temp = "logo in blackAndwhite.jpeg";
> File fi = new File("D:\\" + temp);
> ImageIO.write(bimg, "jpg", fi);
>
> //thinning by resizing gray scale image to desired eight and width
> BufferedImage bimg2 = new BufferedImage((int)image_width, (int)image_height, BufferedImage.TYPE_INT_ARGB);
> Graphics2D g2 = bimg2.createGraphics();
>
> // Perform your drawing here
> g2.setColor(Color.BLACK);
> g2.drawLine(0, 0, 200, 200);
>
> //saving thinned image onto drive
> String temp2 = "logo thinned.jpeg";
> File fi2 = new File("D:\\" + temp2);
> ImageIO.write(bimg2, "jpg", fi2);
> //g2.dispose();
> }
> catch (Exception e)
> {
> System.out.println(e);
> }
> }
>
>


public static BufferedImage convertToGray(BufferedImage image) {
BufferedImage gray = new BufferedImage(image.getWidth(),
image.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
ColorConvertOp op = new ColorConvertOp(
image.getColorModel().getColorSpace(),
gray.getColorModel().getColorSpace(),null);
op.filter(image,gray);
return gray;
}

You can use the same technique as above with an AffineTransformOp, as
John Matthews mentioned, to scale an image.

--

Knute Johnson


 
Reply With Quote
 
 
 
 
John B. Matthews
Guest
Posts: n/a
 
      06-27-2012
In article <jsd9em$hur$(E-Mail Removed)>,
Knute Johnson <(E-Mail Removed)> wrote:

> public static BufferedImage convertToGray(BufferedImage image) {
> BufferedImage gray = new BufferedImage(image.getWidth(),
> image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
> ColorConvertOp op = new ColorConvertOp(
> image.getColorModel().getColorSpace(),
> gray.getColorModel().getColorSpace(), null);
> op.filter(image, gray);
> return gray;
> }


Thanks for weighing in on this. Your approach has always worked
flawlessly on JPG images, but I had trouble with a PNG file: the result
was unusually dark, and a subsequent call to gray.getGrapics() failed.
I'd welcome any insight you can offer.

> You can use the same technique as above with an AffineTransformOp, as
> John Matthews mentioned, to scale an image.


I had good results with AffineTransformOp.TYPE_NEAREST_NEIGHBOR for
down sampling:

<https://sites.google.com/site/trashgod/scaled>

As recently suggested by BGB:

<https://groups.google.com/d/msg/comp.lang.java.programmer/zH_xK85o2mA/V--P6ruObwUJ>

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
 
Reply With Quote
 
 
 
 
Knute Johnson
Guest
Posts: n/a
 
      06-27-2012
On 6/26/2012 8:15 PM, John B. Matthews wrote:
> In article <jsd9em$hur$(E-Mail Removed)>,
> Knute Johnson <(E-Mail Removed)> wrote:
>
>> public static BufferedImage convertToGray(BufferedImage image) {
>> BufferedImage gray = new BufferedImage(image.getWidth(),
>> image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
>> ColorConvertOp op = new ColorConvertOp(
>> image.getColorModel().getColorSpace(),
>> gray.getColorModel().getColorSpace(), null);
>> op.filter(image, gray);
>> return gray;
>> }

>
> Thanks for weighing in on this. Your approach has always worked
> flawlessly on JPG images, but I had trouble with a PNG file: the result
> was unusually dark, and a subsequent call to gray.getGrapics() failed.
> I'd welcome any insight you can offer.
>
>> You can use the same technique as above with an AffineTransformOp, as
>> John Matthews mentioned, to scale an image.

>
> I had good results with AffineTransformOp.TYPE_NEAREST_NEIGHBOR for
> down sampling:
>
> <https://sites.google.com/site/trashgod/scaled>
>
> As recently suggested by BGB:
>
> <https://groups.google.com/d/msg/comp.lang.java.programmer/zH_xK85o2mA/V--P6ruObwUJ>
>


You got me interested on that one. I made a really simple test program
because of time constraints.

What I found was that if you just did a ColorConvertOP to a PNG or a
JPEG image, the image was in fact fairly dark. But if you then convert
that image to a compatible image it looks really good in gray scale.

Here's the simple code.

package com.knutejohnson.test;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

import com.knutejohnson.classes.ImageUtilities;

public class PNGtoGray extends JPanel implements ActionListener {
private BufferedImage bi;

public PNGtoGray(BufferedImage bi) {
this.bi = bi;

setPreferredSize(new Dimension(bi.getWidth(),bi.getHeight()));
}

public void actionPerformed(ActionEvent ae) {
bi = ImageUtilities.convertToGray(bi);
bi = ImageUtilities.convertToCompatible(bi);
repaint();
}

public void paintComponent(Graphics g) {
g.drawImage(bi,0,0,null);
}

public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BufferedImage bi = ImageIO.read(new File(args[0]));
JFrame f = new JFrame("PNGtoGray");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
PNGtoGray ptg = new PNGtoGray(bi);
f.add(ptg,BorderLayout.CENTER);
JButton b = new JButton("Conver to Gray");
b.addActionListener(ptg);
f.add(b,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
} catch (IOException ioe) {
System.out.println(ioe);
}
}
});
}
}

package com.knutejohnson.classes;

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.imageio.plugins.jpeg.*;

public class ImageUtilities {
public static void writeJPEG(RenderedImage image, float quality,
File file)
throws IOException {
if (quality < 0.0f || quality > 1.0f)
throw new IllegalArgumentException("0.0 < Quality < 1.0");
ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("JPEG");
if (!iter.hasNext())
throw new IOException("No Writers Available");
writer = (ImageWriter)iter.next();
if (file.exists())
file.delete();
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
writer.setOutput(ios);
JPEGImageWriteParam iwp = new JPEGImageWriteParam(null);
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLIC IT);
iwp.setCompressionQuality(quality);
writer.write(null,new IIOImage(image,null,null),iwp);
ios.flush();
writer.dispose();
ios.close();
}

public static BufferedImage convertToGray(BufferedImage image) {
BufferedImage gray = new BufferedImage(image.getWidth(),
image.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
ColorConvertOp op = new ColorConvertOp(
image.getColorModel().getColorSpace(),
gray.getColorModel().getColorSpace(),null);
op.filter(image,gray);
return gray;
}

public static BufferedImage scaleImage(BufferedImage src, double sx,
double sy, int interpolationType) {
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(sx,sy),interpolat ionType);
return op.filter(src,null);
}

public static BufferedImage scaleImage(BufferedImage src, double sx,
double sy, RenderingHints hints) {
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(sx,sy),hints);
return op.filter(src,null);
}

public static BufferedImage convertToCompatible(BufferedImage image) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();

BufferedImage compatible =
gc.createCompatibleImage(image.getWidth(),
image.getHeight());

if (compatible.getType() == image.getType())
return image;

ColorConvertOp op = new ColorConvertOp(
image.getColorModel().getColorSpace(),
compatible.getColorModel().getColorSpace(),null);

return op.filter(image,compatible);
}
}


--

Knute Johnson


 
Reply With Quote
 
John B. Matthews
Guest
Posts: n/a
 
      06-28-2012
In article <jse48p$pku$(E-Mail Removed)>,
Knute Johnson <(E-Mail Removed)> wrote:

> What I found was that if you just did a ColorConvertOP to a PNG or a
> JPEG image, the image was in fact fairly dark. But if you then convert
> that image to a compatible image it looks really good in gray scale.


Having a compatible image was the key; thank you.

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Image Thinning using JAVA Roedy Green Java 0 06-27-2012 02:01 PM
Re: Image Thinning using JAVA John B. Matthews Java 0 06-26-2012 06:39 PM
Help with thinning hair hairy.stone Computer Support 0 08-08-2007 11:51 AM
image library for Java (WSQ image library for fingerprints) released info@cognaxon.com Java 0 07-19-2006 09:10 AM
wx.Image: Couldn't add an image to the image list. Laszlo Zsolt Nagy Python 1 01-26-2005 09:55 PM



Advertisments