Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   Re: Image Thinning using JAVA (http://www.velocityreviews.com/forums/t947555-re-image-thinning-using-java.html)

Knute Johnson 06-26-2012 09:26 PM

Re: Image Thinning using JAVA
 
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



John B. Matthews 06-27-2012 03:15 AM

Re: Image Thinning using JAVA
 
In article <jsd9em$hur$1@dont-email.me>,
Knute Johnson <nospam@knutejohnson.com> 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>

Knute Johnson 06-27-2012 05:04 AM

Re: Image Thinning using JAVA
 
On 6/26/2012 8:15 PM, John B. Matthews wrote:
> In article <jsd9em$hur$1@dont-email.me>,
> Knute Johnson <nospam@knutejohnson.com> 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



John B. Matthews 06-28-2012 01:35 AM

Re: Image Thinning using JAVA
 
In article <jse48p$pku$1@dont-email.me>,
Knute Johnson <nospam@knutejohnson.com> 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>


All times are GMT. The time now is 04:26 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.