public void test01() throws java.lang.Exception { final File imageFile = new File("test/data/clown24.png"); final double tolerance = 0.01; final double[][] expectedCenters = { {182.389, 108.690, 45.733}, {224.589, 187.087, 151.137}, {115.623, 51.116, 20.329}, {30.557, 10.600, 5.617}, }; assertTrue("File exists", imageFile.exists()); // Read test image final ImagePlus imp = IOUtils.openImage(imageFile); if (imp.getType() != ImagePlus.COLOR_RGB) { throw new java.lang.Exception("Expecting color image."); } // Convert RGB to a stack final ImageConverter ic = new ImageConverter(imp); ic.convertToRGBStack(); final StackConverter sc = new StackConverter(imp); sc.convertToGray32(); final KMeans.Config config = new KMeans.Config(); config.setNumberOfClusters(4); config.setRandomizationSeedEnabled(true); config.setRandomizationSeed(31415); final KMeans kmeans = new KMeans(config); final ImageProcessor ip = kmeans.run(imp.getStack()); assertNotNull(ip); float[][] centers = kmeans.getClusterCenters(); for (int i = 0; i < centers.length; i++) { for (int j = 0; j < centers[i].length; j++) { assertEquals( "center[" + i + "][" + j + "]", expectedCenters[i][j], centers[i][j], tolerance); } } // final ImagePlus imp1 = new ImagePlus("K-means", ip); // final FileSaver saver = new FileSaver(imp1); // saver.saveAsTiff("kmeans-output.tif"); }
/** * Creates an @link{ImageStack} by converting an @link{ImagePlus} object Duplicate of a method * in @link{KmeansClusteringPlugin} * * @param src the @link{ImagePlus} object to convert * @return an @link{ImageStack} object containing the */ private static ImageStack convertToFloatStack(final ImagePlus src) { final ImagePlus imp = duplicate(src); // Remember scaling setup final boolean doScaling = ImageConverter.getDoScaling(); try { // Disable scaling ImageConverter.setDoScaling(false); if (imp.getType() == ImagePlus.COLOR_RGB) { if (imp.getStackSize() > 1) { throw new RuntimeException("Unsupported image type: stack of COLOR_RGB"); } final ImageConverter converter = new ImageConverter(imp); converter.convertToRGBStack(); } if (imp.getStackSize() > 1) { final StackConverter converter = new StackConverter(imp); converter.convertToGray32(); } else { final ImageConverter converter = new ImageConverter(imp); converter.convertToGray32(); } // FIXME: make sure that there are no memory leaks // imp.flush(); return imp.getStack(); } finally { // Restore original scaling option ImageConverter.setDoScaling(doScaling); } }