private float d(Image i1, Image i2) {
   double d = 0;
   for (int i = 0; i < i1.getDataShort().length; i++) {
     d +=
         (i1.getDataShort()[i] - i2.getDataShort()[i])
             * (i1.getDataShort()[i] - i2.getDataShort()[i]);
   }
   return (float) Math.sqrt(d);
 }
 public void constructNormalizedImageClusters() {
   clusterImages.clear();
   for (int i = 0; i < noClusters; i++) {
     Image image = new ImageFloat(dimFilterX, dimFilterY);
     System.arraycopy(
         memClusters.getSrc(),
         i * dimFilterX * dimFilterY,
         image.getDataFloat(),
         0,
         dimFilterX * dimFilterY);
     clusterImages.add(image);
   }
 }
 private void constructImageClusters() {
   for (int i = 0; i < noClusters; i++) {
     Image image = new ImageFloat(dimFilterX, dimFilterY);
     double max = -1 * Double.MAX_VALUE;
     double min = Double.MAX_VALUE;
     int clusterOffset = dimFilterX * dimFilterY * i;
     for (int j = 0; j < dimFilterX * dimFilterY; j++) {
       if (clustersCenters[clusterOffset + j] > max) max = clustersCenters[clusterOffset + j];
       if (clustersCenters[clusterOffset + j] < min) min = clustersCenters[clusterOffset + j];
     }
     max = 255 / (max - min);
     for (int j = 0; j < dimFilterX * dimFilterY; j++) {
       image.getDataFloat()[j] = (float) ((clustersCenters[clusterOffset + j] - min) * max);
     }
     clusterImages.add(image);
   }
 }
 private void randomizeClustersFromData() {
   List<Image> filters = new ArrayList<>();
   int dimImage = (int) Math.sqrt(imageSize);
   while (filters.size() < noClusters) {
     Image initCluster = images.get((int) (Math.random() * images.size()));
     int x = strideX * ((int) (getInitOffset() * ((dimImage - dimFilterX) / strideX)));
     int y = strideY * ((int) (getInitOffset() * ((dimImage - dimFilterY) / strideY)));
     Image filter = initCluster.extractImage(x, y, dimFilterX, dimFilterY);
     if (okToAdd(filters, filter)) {
       // System.out.println(filters.size());
       filters.add(filter);
     }
   }
   for (int i = 0; i < noClusters; i++) {
     for (int j = 0; j < dimFilterX * dimFilterY; j++) {
       clustersCenters[i * dimFilterX * dimFilterY + j] = filters.get(i).getDataShort()[j];
     }
   }
 }