anchor.diff:                      matchesWest = true;
                   }
                   if(!matchesNorth && !matchesWest){
  +                    //new group discovered
  +                    // stderr.writeln("Creating blob group $groupIndex");
                       blobs[groupIndex] = new Set.from([cp]);
                       equivs[groupIndex] = new Set.from([groupIndex]);
                       groups[cp] = groupIndex;
  
positive.code:                     groupIndex++;
                  } else if (matchesNorth && !matchesWest){
                      int group = groups[northPoint];
                      blobs[group].add(cp);
                      groups[cp] = group;
                  } else if (!matchesNorth && matchesWest) {
                      int group = groups[westPoint];
                      blobs[group].add(cp);
                      groups[cp] = group;
                  } else if (matchesNorth && matchesWest && groups[northPoint] == groups[westPoint]) {
                      //current point matches north and west and they're already the same label
                      // p p
                      // p X
                      int group = groups[westPoint];
                      blobs[group].add(cp);
                      groups[cp] = group;
                  } else {
                      //current point matches north and west, but they are different labels
                      // b p
  
negative.code:     }
  
      Point find(Point point){
          if(!parents.containsKey(point)){
              return null;
          }
          if(parents[point] == point){
              return point;
          } else {
              return find(parents[point]);
          }
      }
  
  