Re: Image Thinning using JAVA

Discussion in 'Java' started by Knute Johnson, Jun 26, 2012.

  1. 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
    Knute Johnson, Jun 26, 2012
    #1
    1. Advertising

  2. In article <jsd9em$hur$>,
    Knute Johnson <> 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>
    John B. Matthews, Jun 27, 2012
    #2
    1. Advertising

  3. On 6/26/2012 8:15 PM, John B. Matthews wrote:
    > In article <jsd9em$hur$>,
    > Knute Johnson <> 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_EXPLICIT);
    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),interpolationType);
    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
    Knute Johnson, Jun 27, 2012
    #3
  4. In article <jse48p$pku$>,
    Knute Johnson <> 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>
    John B. Matthews, Jun 28, 2012
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    0
    Views:
    3,290
  2. Laszlo Zsolt Nagy
    Replies:
    1
    Views:
    1,248
    Kartic
    Jan 26, 2005
  3. pandiaraj_4u
    Replies:
    0
    Views:
    1,815
    pandiaraj_4u
    Apr 7, 2010
  4. John B. Matthews

    Re: Image Thinning using JAVA

    John B. Matthews, Jun 26, 2012, in forum: Java
    Replies:
    0
    Views:
    427
    John B. Matthews
    Jun 26, 2012
  5. Roedy Green

    Re: Image Thinning using JAVA

    Roedy Green, Jun 27, 2012, in forum: Java
    Replies:
    0
    Views:
    381
    Roedy Green
    Jun 27, 2012
Loading...

Share This Page