Example Fit Ellipse
From BoofCV
Jump to navigationJump to searchThe printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Fitting ellipses to 2D objects found in images is a common task in industrial and scientific settings. In this example, binary blobs are found inside an image of particles and the best fit ellipses found. In a real application the next step could be to analyze the size distribution of the found ellipses to characterize the particles.
Example Code:
Concepts:
- Object contours/edges
- Best fit shape
Relevant Examples:
Example Code
/**
* Demonstration which fits ellipses to object contours in a binary image.
*
* @author Peter Abeles
*/
public class ExampleFitEllipse {
public static void main( String[] args ) {
// load and convert the image into a usable format
BufferedImage image = UtilImageIO.loadImage(UtilIO.pathExample("particles01.jpg"));
GrayF32 input = ConvertBufferedImage.convertFromSingle(image, null, GrayF32.class);
GrayU8 binary = new GrayU8(input.width,input.height);
// the mean pixel value is often a reasonable threshold when creating a binary image
double mean = ImageStatistics.mean(input);
// create a binary image by thresholding
ThresholdImageOps.threshold(input, binary, (float) mean, true);
// reduce noise with some filtering
GrayU8 filtered = BinaryImageOps.erode8(binary, 1, null);
filtered = BinaryImageOps.dilate8(filtered, 1, null);
// Find only external contours around each shape. Much faster than if internal + labeled images are considered.
List<Contour> contours = BinaryImageOps.contourExternal(filtered, ConnectRule.EIGHT);
// Fit an ellipse to each external contour and draw the results
Graphics2D g2 = image.createGraphics();
g2.setStroke(new BasicStroke(3));
g2.setColor(Color.RED);
for( Contour c : contours ) {
FitData<EllipseRotated_F64> ellipse = ShapeFittingOps.fitEllipse_I32(c.external,0,false,null);
VisualizeShapes.drawEllipse(ellipse.shape, g2);
}
// ShowImages.showWindow(VisualizeBinaryData.renderBinary(filtered, false, null),"Binary",true);
ShowImages.showWindow(image,"Ellipses",true);
}
}