Difference between revisions of "Example Superpixels"
From BoofCV
Jump to navigationJump to searchm |
m (Peter moved page Example Image Segmentation to Example Superpixels) |
(No difference)
|
Revision as of 09:14, 12 September 2014
Image segmentation is an important (and very much unsolved) problem in computer vision. In this example, different techniques are used to break the image up into regions (or superpixels). The goal of this segmentation is to simplify the image's description, which can then be used for object detection/recognition.
Example Code:
Concepts:
- Image Segmentation
- Super Pixels
Related Examples:
Relevant Applets:
Example Code
/**
* Example demonstrating high level image segmentation interface. An image segmented using this
* interface will have each pixel assigned a unique label from 0 to N-1, where N is the number of regions.
* All pixels which belong to the same region are connected. These regions are also known as superpixels.
*
* @author Peter Abeles
*/
public class ExampleImageSegmentation {
/**
* Segments and visualizes the image
*/
public static <T extends ImageBase>
void performSegmentation( ImageSegmentation<T> alg , T color )
{
// Segmentation often works better after blurring the image. Reduces high frequency image components which
// can cause over segmentation
GBlurImageOps.gaussian(color, color, 0.5, -1, null);
// Storage for segmented image. Each pixel will be assigned a label from 0 to N-1, where N is the number
// of segments in the image
ImageSInt32 pixelToSegment = new ImageSInt32(color.width,color.height);
// Segmentation magic happens here
alg.segment(color,pixelToSegment);
// Displays the results
visualize(pixelToSegment,color,alg.getTotalSegments());
}
/**
* Visualizes results three ways. 1) Colorized segmented image where each region is given a random color.
* 2) Each pixel is assigned the mean color through out the region. 3) Black pixels represent the border
* between regions.
*/
public static <T extends ImageBase>
void visualize( ImageSInt32 pixelToRegion , T color , int numSegments )
{
// Computes the mean color inside each region
ImageType<T> type = color.getImageType();
ComputeRegionMeanColor<T> colorize = FactorySegmentationAlg.regionMeanColor(type);
FastQueue<float[]> segmentColor = new ColorQueue_F32(type.getNumBands());
segmentColor.resize(numSegments);
GrowQueue_I32 regionMemberCount = new GrowQueue_I32();
regionMemberCount.resize(numSegments);
ImageSegmentationOps.countRegionPixels(pixelToRegion, numSegments, regionMemberCount.data);
colorize.process(color,pixelToRegion,regionMemberCount,segmentColor);
// Draw each region using their average color
BufferedImage outColor = VisualizeRegions.regionsColor(pixelToRegion,segmentColor,null);
// Draw each region by assigning it a random color
BufferedImage outSegments = VisualizeRegions.regions(pixelToRegion, numSegments, null);
// Make region edges appear red
BufferedImage outBorder = new BufferedImage(color.width,color.height,BufferedImage.TYPE_INT_RGB);
ConvertBufferedImage.convertTo(color,outBorder,true);
VisualizeRegions.regionBorders(pixelToRegion,0xFF0000,outBorder);
// Show the visualization results
ShowImages.showWindow(outSegments, "Regions");
ShowImages.showWindow(outBorder,"Region Borders");
ShowImages.showWindow(outColor,"Color of Segments");
}
public static void main(String[] args) {
BufferedImage image = UtilImageIO.loadImage("../data/applet/segment/berkeley_horses.jpg");
// BufferedImage image = UtilImageIO.loadImage("../data/applet/segment/berkeley_kangaroo.jpg");
// BufferedImage image = UtilImageIO.loadImage("../data/applet/segment/berkeley_man.jpg");
// BufferedImage image = UtilImageIO.loadImage("../data/applet/segment/mountain_pines_people.jpg");
// BufferedImage image = UtilImageIO.loadImage("../data/applet/particles01.jpg");
// Select input image type. Some algorithms behave different depending on image type
ImageType<MultiSpectral<ImageFloat32>> imageType = ImageType.ms(3,ImageFloat32.class);
// ImageType<MultiSpectral<ImageUInt8>> imageType = ImageType.ms(3,ImageUInt8.class);
// ImageType<ImageFloat32> imageType = ImageType.single(ImageFloat32.class);
// ImageType<ImageUInt8> imageType = ImageType.single(ImageUInt8.class);
// ImageSegmentation alg = FactoryImageSegmentation.meanShift(null, imageType);
// ImageSegmentation alg = FactoryImageSegmentation.slic(new ConfigSlic(800), imageType);
ImageSegmentation alg = FactoryImageSegmentation.fh04(new ConfigFh04(100,30), imageType);
// ImageSegmentation alg = FactoryImageSegmentation.watershed(ConnectRule.EIGHT);
// Convert image into BoofCV format
ImageBase color = imageType.createImage(image.getWidth(),image.getHeight());
ConvertBufferedImage.convertFrom(image, color, true);
// Segment and display results
performSegmentation(alg,color);
}
}