Difference between revisions of "Example Image Enhancement"

From BoofCV
Jump to navigationJump to search
m
m
 
Line 10: Line 10:


Example Code:
Example Code:
* [https://github.com/lessthanoptimal/BoofCV/blob/v0.38/examples/src/boofcv/examples/enhance/ExampleImageEnhancement.java ExampleImageEnhancement.java]
* [https://github.com/lessthanoptimal/BoofCV/blob/v0.40/examples/src/boofcv/examples/enhance/ExampleImageEnhancement.java ExampleImageEnhancement.java]


Concepts:
Concepts:
Line 39: Line 39:
*/
*/
public static void histogram() {
public static void histogram() {
BufferedImage buffered = UtilImageIO.loadImage(UtilIO.pathExample(imagePath));
BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
GrayU8 gray = ConvertBufferedImage.convertFrom(buffered,(GrayU8)null);
GrayU8 gray = ConvertBufferedImage.convertFrom(buffered, (GrayU8)null);
GrayU8 adjusted = gray.createSameShape();
GrayU8 adjusted = gray.createSameShape();


int histogram[] = new int[256];
int[] histogram = new int[256];
int transform[] = new int[256];
int[] transform = new int[256];


ListDisplayPanel panel = new ListDisplayPanel();
ListDisplayPanel panel = new ListDisplayPanel();


ImageStatistics.histogram(gray,0, histogram);
ImageStatistics.histogram(gray, 0, histogram);
EnhanceImageOps.equalize(histogram, transform);
EnhanceImageOps.equalize(histogram, transform);
EnhanceImageOps.applyTransform(gray, transform, adjusted);
EnhanceImageOps.applyTransform(gray, transform, adjusted);
Line 54: Line 54:


EnhanceImageOps.equalizeLocal(gray, 50, adjusted, 256, null);
EnhanceImageOps.equalizeLocal(gray, 50, adjusted, 256, null);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null),"Local");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Local");


panel.addImage(ConvertBufferedImage.convertTo(gray, null), "Original");
panel.addImage(ConvertBufferedImage.convertTo(gray, null), "Original");
Line 66: Line 66:
*/
*/
public static void histogramColor() {
public static void histogramColor() {
BufferedImage buffered = UtilImageIO.loadImage(UtilIO.pathExample(imagePath));
BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered,true, ImageType.PL_U8);
Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered, true, ImageType.PL_U8);
Planar<GrayU8> adjusted = color.createSameShape();
Planar<GrayU8> adjusted = color.createSameShape();


int histogram[] = new int[256];
int[] histogram = new int[256];
int transform[] = new int[256];
int[] transform = new int[256];


ListDisplayPanel panel = new ListDisplayPanel();
ListDisplayPanel panel = new ListDisplayPanel();
Line 78: Line 78:
// on a gray scale image then apply the same transform to each band
// on a gray scale image then apply the same transform to each band
for (int bandIdx = 0; bandIdx < color.getNumBands(); bandIdx++) {
for (int bandIdx = 0; bandIdx < color.getNumBands(); bandIdx++) {
ImageStatistics.histogram(color.getBand(bandIdx),0, histogram);
ImageStatistics.histogram(color.getBand(bandIdx), 0, histogram);
EnhanceImageOps.equalize(histogram, transform);
EnhanceImageOps.equalize(histogram, transform);
EnhanceImageOps.applyTransform(color.getBand(bandIdx), transform, adjusted.getBand(bandIdx));
EnhanceImageOps.applyTransform(color.getBand(bandIdx), transform, adjusted.getBand(bandIdx));
Line 85: Line 85:


GEnhanceImageOps.equalizeLocal(color, 50, adjusted, 256, null);
GEnhanceImageOps.equalizeLocal(color, 50, adjusted, 256, null);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null, true),"Local");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Local");
panel.addImage(buffered, "Original");
panel.addImage(buffered, "Original");


Line 96: Line 96:
*/
*/
public static void sharpen() {
public static void sharpen() {
BufferedImage buffered = UtilImageIO.loadImage(UtilIO.pathExample(imagePath));
BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
GrayU8 gray = ConvertBufferedImage.convertFrom(buffered,(GrayU8)null);
GrayU8 gray = ConvertBufferedImage.convertFrom(buffered, (GrayU8)null);
GrayU8 adjusted = gray.createSameShape();
GrayU8 adjusted = gray.createSameShape();


Line 104: Line 104:


EnhanceImageOps.sharpen4(gray, adjusted);
EnhanceImageOps.sharpen4(gray, adjusted);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null),"Sharpen-4");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Sharpen-4");


EnhanceImageOps.sharpen8(gray, adjusted);
EnhanceImageOps.sharpen8(gray, adjusted);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null),"Sharpen-8");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Sharpen-8");


panel.addImage(ConvertBufferedImage.convertTo(gray,null),"Original");
panel.addImage(ConvertBufferedImage.convertTo(gray, null), "Original");


panel.setPreferredSize(new Dimension(gray.width,gray.height));
panel.setPreferredSize(new Dimension(gray.width, gray.height));
mainPanel.addItem(panel, "Sharpen");
mainPanel.addItem(panel, "Sharpen");
}
}
Line 119: Line 119:
*/
*/
public static void sharpenColor() {
public static void sharpenColor() {
BufferedImage buffered = UtilImageIO.loadImage(UtilIO.pathExample(imagePath));
BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered,true, ImageType.PL_U8);
Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered, true, ImageType.PL_U8);
Planar<GrayU8> adjusted = color.createSameShape();
Planar<GrayU8> adjusted = color.createSameShape();


Line 126: Line 126:


GEnhanceImageOps.sharpen4(color, adjusted);
GEnhanceImageOps.sharpen4(color, adjusted);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null, true),"Sharpen-4");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Sharpen-4");


GEnhanceImageOps.sharpen8(color, adjusted);
GEnhanceImageOps.sharpen8(color, adjusted);
panel.addImage(ConvertBufferedImage.convertTo(adjusted,null, true),"Sharpen-8");
panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Sharpen-8");


panel.addImage(buffered,"Original");
panel.addImage(buffered, "Original");


panel.setPreferredSize(new Dimension(color.width,color.height));
panel.setPreferredSize(new Dimension(color.width, color.height));
mainPanel.addItem(panel, "Sharpen Color");
mainPanel.addItem(panel, "Sharpen Color");
}
}


public static void main( String[] args )
public static void main( String[] args ) {
{
histogram();
histogram();
histogramColor();
histogramColor();
sharpen();
sharpen();
sharpenColor();
sharpenColor();
ShowImages.showWindow(mainPanel,"Enhancement",true);
ShowImages.showWindow(mainPanel, "Enhancement", true);
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:28, 17 January 2022

Demonstration of different image enhancement operations. If an image is excessively dark or light the visibility of features can be improved by adjusting its histogram. Another technique makes the edges in an image more pronounced by.

Example Code:

Concepts:

  • Visibility

Relevant Examples:

Example Code

/**
 * Demonstration of various ways an image can be "enhanced". Image enhancement typically refers to making it easier
 * for people to view the image and pick out its details.
 *
 * @author Peter Abeles
 */
public class ExampleImageEnhancement {

	static String imagePath = "enhance/dark.jpg";
//	static String imagePath = "enhance/dull.jpg";

	static ListDisplayPanel mainPanel = new ListDisplayPanel();

	/**
	 * Histogram adjustment algorithms aim to spread out pixel intensity values uniformly across the allowed range.
	 * This if an image is dark, it will have greater contrast and be brighter.
	 */
	public static void histogram() {
		BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
		GrayU8 gray = ConvertBufferedImage.convertFrom(buffered, (GrayU8)null);
		GrayU8 adjusted = gray.createSameShape();

		int[] histogram = new int[256];
		int[] transform = new int[256];

		ListDisplayPanel panel = new ListDisplayPanel();

		ImageStatistics.histogram(gray, 0, histogram);
		EnhanceImageOps.equalize(histogram, transform);
		EnhanceImageOps.applyTransform(gray, transform, adjusted);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Global");

		EnhanceImageOps.equalizeLocal(gray, 50, adjusted, 256, null);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Local");

		panel.addImage(ConvertBufferedImage.convertTo(gray, null), "Original");

		panel.setPreferredSize(new Dimension(gray.width, gray.height));
		mainPanel.addItem(panel, "Histogram");
	}

	/**
	 * Same as above but on a color image.
	 */
	public static void histogramColor() {
		BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
		Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered, true, ImageType.PL_U8);
		Planar<GrayU8> adjusted = color.createSameShape();

		int[] histogram = new int[256];
		int[] transform = new int[256];

		ListDisplayPanel panel = new ListDisplayPanel();

		// Apply the correction to each color band independently. Alternatively, you could compute the adjustment
		// on a gray scale image then apply the same transform to each band
		for (int bandIdx = 0; bandIdx < color.getNumBands(); bandIdx++) {
			ImageStatistics.histogram(color.getBand(bandIdx), 0, histogram);
			EnhanceImageOps.equalize(histogram, transform);
			EnhanceImageOps.applyTransform(color.getBand(bandIdx), transform, adjusted.getBand(bandIdx));
		}
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Global");

		GEnhanceImageOps.equalizeLocal(color, 50, adjusted, 256, null);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Local");
		panel.addImage(buffered, "Original");

		panel.setPreferredSize(new Dimension(color.width, color.height));
		mainPanel.addItem(panel, "Histogram Color");
	}

	/**
	 * When an image is sharpened the intensity of edges are made more extreme while flat regions remain unchanged.
	 */
	public static void sharpen() {
		BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
		GrayU8 gray = ConvertBufferedImage.convertFrom(buffered, (GrayU8)null);
		GrayU8 adjusted = gray.createSameShape();


		ListDisplayPanel panel = new ListDisplayPanel();

		EnhanceImageOps.sharpen4(gray, adjusted);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Sharpen-4");

		EnhanceImageOps.sharpen8(gray, adjusted);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null), "Sharpen-8");

		panel.addImage(ConvertBufferedImage.convertTo(gray, null), "Original");

		panel.setPreferredSize(new Dimension(gray.width, gray.height));
		mainPanel.addItem(panel, "Sharpen");
	}

	/**
	 * Same as above but on a color image
	 */
	public static void sharpenColor() {
		BufferedImage buffered = UtilImageIO.loadImageNotNull(UtilIO.pathExample(imagePath));
		Planar<GrayU8> color = ConvertBufferedImage.convertFrom(buffered, true, ImageType.PL_U8);
		Planar<GrayU8> adjusted = color.createSameShape();

		ListDisplayPanel panel = new ListDisplayPanel();

		GEnhanceImageOps.sharpen4(color, adjusted);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Sharpen-4");

		GEnhanceImageOps.sharpen8(color, adjusted);
		panel.addImage(ConvertBufferedImage.convertTo(adjusted, null, true), "Sharpen-8");

		panel.addImage(buffered, "Original");

		panel.setPreferredSize(new Dimension(color.width, color.height));
		mainPanel.addItem(panel, "Sharpen Color");
	}

	public static void main( String[] args ) {
		histogram();
		histogramColor();
		sharpen();
		sharpenColor();
		ShowImages.showWindow(mainPanel, "Enhancement", true);
	}
}