The RescaleOp
filter applies a scaling factor and an offset to each color components
so as to brighten or dim an image:
destColor = sourceColor * scalefactor + offset
You could do this also with a look up table but you need less code
with this filter. For example,
RescaleOp brightenOp = new RescaleOp(2.0f,
32f, null);
BufferedImage dest_image = brightenOp.filter(sourceImage,
null);
Here each color component of each pixel is multiplied by 2.0 and
then added to 32. If the value exceeds the maximum for that component,
the maximum is used.
In the RescaleApplet
example below, we use the RescaleOp
filter to multiply the color component values with a scaling factor
and also add an offset value. The user selects the scaling and offset
via two sliders.
RescaleApplet
Resources: saturnVoyager.jpg
|
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.event.*;
/** Demonstrate the rescale filter. **/
public class RescaleApplet extends JApplet
implements
ChangeListener {
BufferedImage fSrcImage, fDstImage;
ImageIcon fDstIcon;
JLabel fRescaleLabel, fOffsetLabel;
JSlider fRescaleSlider,fOffsetSlider;
float fScaleFactor = 1.0f;
float fOffset = 1.0f;
/**
* Build the interface with the source
and filter output image
* displayed side by side.
**/
public void init () {
setLayout (new BorderLayout ());
fSrcImage = getBufImage ("saturnVoyager.jpg");
if (fSrcImage == null) {
System.out.println
("Error in reading image file!");
return;
}
JPanel control_panel = new JPanel(new
GridLayout (2,1));
control_panel.add (fRescaleLabel
=
new JLabel ("Scale factor 1 ",SwingConstants.RIGHT) );
control_panel.add (fRescaleSlider
=
new JSlider (Adjustable.HORIZONTAL, 0, 255, 1));
fRescaleSlider.addChangeListener
(this);
control_panel.add (fOffsetLabel
=
new JLabel ("Offset 0 ",SwingConstants.RIGHT) );
control_panel.add (fOffsetSlider
=
new JSlider (Adjustable.HORIZONTAL, 0, 255, 0));
fOffsetSlider.addChangeListener
(this);
// Rescale with default scale and
offset values.
rescaleFilter();
// Use ImageIcon objects to hold
the two images
ImageIcon src_icon = new ImageIcon
(fSrcImage);
fDstIcon = new ImageIcon (fDstImage);
// Put the icons on labels
JLabel src_display = new JLabel
(src_icon);
JLabel dst_display = new JLabel
(fDstIcon);
// And then display the labels on
the scroll panes
JScrollPane src_pane = new JScrollPane
(src_display);
JScrollPane dst_pane = new JScrollPane
(dst_display);
// Use a JSplitPane to show the
source and destination
// images side by side.
JSplitPane split_pane =
new JSplitPane (JSplitPane.HORIZONTAL_SPLIT,
true, src_pane, dst_pane);
split_pane.setResizeWeight (0.5);
split_pane.setContinuousLayout (true);
// Add the DrawingPanel to the contentPane.
add (split_pane, BorderLayout.CENTER);
add (control_panel, BorderLayout.SOUTH);
} // init
/**
* This class implements ChangeListener
for the
* slider. So the ChangeEvents come
here when the
* slider is moved.
**/
public void stateChanged (ChangeEvent evt) {
// Use the label to show the numerical
value of the slider.
fRescaleLabel.setText ("Scale factor
" +
Integer.toHexString (fRescaleSlider.getValue ()));
// Get the values from the slider
and set a new scale factor.
fScaleFactor = fRescaleSlider.getValue
();
// Use the label to show the numerical
value of the slider.
fOffsetLabel.setText ("Offset "
+
Integer.toHexString (fOffsetSlider.getValue ()));
// Get the values from the slider
and set a new scale factor.
fOffset = fOffsetSlider.getValue
();
// Rescale with latest scale and
offset values.
rescaleFilter();
// Reset the destination images
with the modified version.
fDstIcon.setImage(fDstImage);
// Repaint to show the modified
image.
repaint ();
} // stateChanged
/** Create the filter to execute a threshold
setting on the
* color component values.
**/
void rescaleFilter () {
RescaleOp brighten_op
= new RescaleOp (fScaleFactor, fOffset, null);
fDstImage = brighten_op.filter
(fSrcImage, null);
} // rescaleFilter
/**
* Download the image file and convert
to a
* BufferedImage object.
*/
BufferedImage getBufImage (String image_name){
// Get the image
Image img = getImage (getCodeBase(),
image_name);
// and use a MediaTracker to load
it before converting it to
// a BufferedImage.
try {
MediaTracker tracker
= new MediaTracker (this);
tracker.addImage (img,0);
tracker.waitForID (0);
} catch (InterruptedException e)
{ return null; }
int width = img.getWidth (this);
int height= img.getHeight (this);
BufferedImage buffered_image =
new BufferedImage (width,
height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = buffered_image.createGraphics
();
g2.drawImage (img,0 ,0, null);
return buffered_image;
} // getBufImage
} // class RescaleApplet
|
Color
Conversion
The ColorConvertOp
filter changes an image from one color space to another. A common
requirement in image processing is to change to gray scale. The
following code shows how to create such a color to gray conversion:
ColorSpace gray_space =
ColorSpace.getInstance (ColorSpace.CS_GRAY);
ColorConvertOp convertToGrayOp = new ColorConvertOp ( gray_space,
null);
BufferedImage gray_image = convertToGrayOp.filter (source_image,
null);
Besides RGB and gray, the java.awt.color.ColorSpace
class offers a number of options for color spaces including CMYK
and HSV.
The ColorConvertApplet
program below applies the ColorConvertOp
to a source image to convert it to gray scale.
ColorConvertApplet
Resources: saturnVoyager.jpg
|
import
javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.event.*;
import java.awt.color.*;
/** Demonstrate a color conversion filter. **/
public class ColorConvertApplet extends JApplet {
BufferedImage fSrcImage, fDstImage;
ImageIcon fDstIcon;
/**
* Build the interface with the source
and filter output image
* displayed side by side.
**/
public void init () {
fSrcImage = getBufImage ("saturnVoyager.jpg");
if (fSrcImage == null) {
System.out.println
("Error in reading image file!");
return;
}
// Convert to gray scale.
convertFilter();
// Use ImageIcon objects to hold the
two images
ImageIcon src_icon = new ImageIcon
(fSrcImage);
fDstIcon = new ImageIcon (fDstImage);
// Put the icons on labels
JLabel src_display = new JLabel (src_icon);
JLabel dst_display = new JLabel (fDstIcon);
// And then display the labels on
the scroll panes
JScrollPane src_pane = new JScrollPane
(src_display);
JScrollPane dst_pane = new JScrollPane
(dst_display);
// Use a JSplitPane to show the source
and destination
// images side by side.
JSplitPane split_pane =
new JSplitPane (JSplitPane.HORIZONTAL_SPLIT,
true,
src_pane, dst_pane);
split_pane.setResizeWeight (0.5);
split_pane.setContinuousLayout (true);
// Add the DrawingPanel to the contentPane.
add (split_pane);
} // init
/** Use ColorConvertOp to convert the source image
to gray scale **/
void convertFilter () {
ColorSpace gray_space =
ColorSpace.getInstance
(ColorSpace.CS_GRAY);
ColorConvertOp convert_to_gray_op
=
new ColorConvertOp (gray_space,
null);
fDstImage = convert_to_gray_op.filter
(fSrcImage, null);
} // rescaleFilter
/**
* Download the image file and convert
to a
* BufferedImage object.
*/
BufferedImage getBufImage (String image_name){
// Get the image
Image img = getImage (getCodeBase(),
image_name);
// and use a MediaTracker to load
it before converting it to
// a BufferedImage.
try {
MediaTracker tracker =
new MediaTracker (this);
tracker.addImage (img,0);
tracker.waitForID (0);
} catch (InterruptedException e) {
return null; }
int width = img.getWidth (this);
int height= img.getHeight (this);
BufferedImage buffered_image =
new BufferedImage (width,
height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = buffered_image.createGraphics
();
g2.drawImage (img,0 ,0, null);
return buffered_image;
} // getBufImage
} // class ColorConvertApplet
|
References & Web Resources
Latest update: March 8, 2006
|