selectBestPatterns() {
			const startSize = this.possibleCenters.length;
			if (startSize < 3) {
				// Couldn't find enough finder patterns
				throw new NotFoundException();
			}
			const possibleCenters = this.possibleCenters;
			let average;
			// Filter outlier possibilities whose module size is too different
			if (startSize > 3) {
				// But we can only afford to do so if we have at least 4 possibilities to choose from
				let totalModuleSize = 0.0;
				let square = 0.0;
				for (const center of this.possibleCenters) {
					const size = center.getEstimatedModuleSize();
					totalModuleSize += size;
					square += size * size;
				}
				average = totalModuleSize / startSize;
				let stdDev = Math.sqrt(square / startSize - average * average);
				possibleCenters.sort(
					/**
					 * <p>Orders by furthest from average</p>
					 */
						// FurthestFromAverageComparator implements Comparator<FinderPattern>
					(center1, center2) => {
						const dA = Math.abs(center2.getEstimatedModuleSize() - average);
						const dB = Math.abs(center1.getEstimatedModuleSize() - average);
						return dA < dB ? -1 : dA > dB ? 1 : 0;
					});
				const limit = Math.max(0.2 * average, stdDev);
				for (let i = 0; i < possibleCenters.length && possibleCenters.length > 3; i++) {
					const pattern = possibleCenters[i];
					if (Math.abs(pattern.getEstimatedModuleSize() - average) > limit) {
						possibleCenters.splice(i, 1);
						i--;
					}
				}
			}
			if (possibleCenters.length > 3) {
				// Throw away all but those first size candidate points we found.
				let totalModuleSize = 0.0;
				for (const possibleCenter of possibleCenters) {
					totalModuleSize += possibleCenter.getEstimatedModuleSize();
				}
				average = totalModuleSize / possibleCenters.length;
				possibleCenters.sort(
					/**
					 * <p>Orders by {@link FinderPattern#getCount()}, descending.</p>
					 */
						// CenterComparator implements Comparator<FinderPattern>
					(center1, center2) => {
						if (center2.getCount() === center1.getCount()) {
							const dA = Math.abs(center2.getEstimatedModuleSize() - average);
							const dB = Math.abs(center1.getEstimatedModuleSize() - average);
							return dA < dB ? 1 : dA > dB ? -1 : 0;
						}
						else {
							return center2.getCount() - center1.getCount();
						}
					});
				possibleCenters.splice(3); // this is not realy necessary as we only return first 3 anyway
			}
			return [
				possibleCenters[0],
				possibleCenters[1],
				possibleCenters[2]
			];
		}
@return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
        those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
        size differs from the average among those patterns the least
@throws NotFoundException if 3 such finder patterns do not exist