private boolean containsText(RegionInfo region) {
      ArrayList<Integer> seeds = new ArrayList<Integer>();
      ArrayList<RegionInfo> list = new ArrayList<RegionInfo>();
      int maxX = region.maxX - region.minX;
      final int width = maxX + 1;
      final int height = region.maxY - region.minY + 1;
      boolean start = false;
      byte[] blob = getSubBlob(region.minX, region.minY, region.maxX, region.maxY);
      writeRegionImage(region, blob, 0);
      for (int i = 0; i < width * height; i++) {
         if (blob[i * 3] == region.marker) {
            start = true;
         }
         else if (blob[i * 3] > 1) {
            start = false;
         }
         else if (start && blob[i * 3] == 0) {
            if (inRegion(blob, region, i)) {
               seeds.add(i);
            }
            else {
               start = false;
            }
         }
         if (i % width == 0) {
            start = false;
         }
      }
      System.out.println("seeds size=" + seeds.size());
      for (Integer seed : seeds) {
         //grow region from the seed points
         RegionInfo rInfo = seedGrowth(seed, 0, width, blob,
            new Callable1<Boolean>() {
               public Boolean call(int idx, int minX, int maxX, int minY, int maxY, byte[] blob) {
                  return BDetection.isBlackSpace(idx, 0, width, height, blob);
               }
            },
            new Callable2<Integer>() {
               public Integer call(int idx, int val, ArrayList<Integer> queue, byte[] blob) {
                  return BDetection.addQueue(idx, queue, blob);
               }
            }
         );
         if (rInfo.pixCount > 1) {
            list.add(rInfo);
         }
      }
      System.out.println("list size=" + list.size());
      writeRegionImage(region, blob, 1);
      return isText(region, list);
   }