PHP - действительно быстрый способ обнаружения пустого пространства вокруг изображения? - PullRequest
4 голосов
/ 26 марта 2012

Мне нужен действительно быстрый метод обнаружения пробелов вокруг изображения, в частности, мне нужны координаты, где начинается первый небелой пиксель для каждой стороны (например, слева, сверху, справа, снизу). )

ImageMagick слишком медленный, поэтому просматривает каждый пиксель вдоль каждой стороны с помощью GD и проверяет, белый ли он. Я должен сделать около 500 000 000 изображений, чтобы каждая микросекунда имела значение.

Кстати, изображение только черно-белое.

Если есть внешнее приложение, которое может сделать это, что я могу exec с PHP, то это было бы хорошо.

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Есть ли какая-либо дополнительная информация об изображениях, которую вы можете использовать, чтобы помочь?

Как изображения начинаются белыми, затем черными и остаются черными? или любой пиксель может быть белым или черным, и тот факт, что любой из них является белым или черным, ничего не говорит вам о других?

Если какой-либо пиксель может быть белым или черным независимо от других пикселей, то я не вижу, как вы можете сделать это намного лучше, чем проверять каждый пиксель в цикле, пока не найдете первый небелой ...

Если вы знаете, что если пятый пиксель слева - белый, то 0-4, безусловно, также белый, тогда вы можете проверить меньшее количество пикселей вместо этого, используя какой-то вид модифицированного поиска двоичного типа (так как вы можете пропустить проверку 0-4 в этом случае и просто отметьте, скажем, 5, затем 10, а если 5 - белый, а 10 - черный, вы знаете, что точка находится где-то между 5-10, поэтому вы можете разделить разницу и проверить 7 и т. Д., Пока не найдете точка, в которой они меняются.)

Я думаю, что здесь вы могли бы найти компромисс между скоростью и точностью. Наиболее точный способ - разрезать каждый столбец и строку, начиная с конечностей, проверяя каждый пиксель. Как только вы нашли попадание в колонне, вы нашли ребро с одной стороны. Это можно сделать параллельно, поскольку каждая проверка независима. Вы могли бы ускорить это, как вы сказали, проверяя только каждый n-й пиксель, но это, скорее всего, иногда будет обрезкой, особенно при таком большом наборе данных. это может или не может быть приемлемым. Вы можете улучшить это, проверив область, в которой вы нашли совпадение, чтобы убедиться, что совпадение является точным. Таким образом, если вы проверяете каждый 3-й пиксель и обнаруживаете попадание в пикселе 15, тогда отметьте 14, чтобы увидеть, является ли оно попаданием (и 13, если 14 равно). используя это, вы можете избежать чеков.

1 голос
/ 26 марта 2012

Один алгоритм, который может работать, если у вас в основном непрерывная граница более темных пикселей: Левая сторона:

  1. Возьмите средний пиксель и начните проверять пиксели вправо, пока не найдете черный.
  2. Затем двигайтесь оттуда вверх / вниз, пока не дойдете до черного пикселя
  3. Когда вы обнаружите, что черный пиксель переместится влево, пока не дойдет до белого *
  4. Повтор 23, пока вы не окажетесь сверху / снизу

Это, конечно, не будет работать, если есть пробелы, как в тексте.

...