Сканирование пиксельной сетки на самом деле очень быстро и эффективно. Это стандартно для систем компьютерного зрения. Многие из этих сканирований производят отфильтрованные по РПИ версии изображений, которые подчеркивают типы разыскиваемых деталей.
Основным техническим термином является «свертка» (см. http://en.wikipedia.org/wiki/Convolution).. Я думаю, что это своего рода взвешенное скользящее среднее, хотя веса могут быть отрицательными. Анимации в Википедии показывают свертку с использованием довольно скучного импульса ( могла бы быть более интересной формой) и для 1D-сигнала (например, звука), а не 2D-сигнала (изображения), но это очень общая концепция.
Соблазнительно думать, что можно сделать что-то более эффективное, если заранее не рассчитать эту отфильтрованную версию, но обычный эффект этого состоит в том, что, поскольку вы не рассчитали все эти пиксели заранее, вы в конечном итоге рассчитываете каждый пиксель несколько раз. Другими словами, представьте, что отфильтрованное изображение является оптимизацией на основе таблицы поиска, или разновидностью динамического программирования .
Некоторые конкретные причины, почему это быстро, это ...
- Это очень удобно для кэширования, поэтому эффективно обращается к памяти.
- Это именно то, для чего предназначены векторные инструкции (MMX, SIMD и т. Д.).
- В наши дни вы даже можете разгрузить работу на вашей видеокарте.
Еще одним преимуществом является то, что вам нужно написать только одну функцию свертки с фильтрацией изображений. Специфичная для приложения часть - это то, как вы определяете ядро фильтра, которое является просто сеткой весовых значений. На самом деле вам, вероятно, вообще не следует писать эту функцию самостоятельно - различные библиотеки числового кода могут предоставлять высокооптимизированные версии.
Для работы с разными цветами линий я просто сначала сгенерировал бы одно изображение в оттенках серого для каждого цвета, а затем отфильтровал и проверил каждое из них отдельно. Опять же, подумайте об этом как об оптимизации - попытка избежать создания отдельных изображений, скорее всего, приведет к увеличению работы, а не к снижению.
- Подумав, я понял это требование. Возможно, имеет смысл сгенерировать черно-белое изображение из черно-белого цвета, отфильтровать его и найти из него все пересечения. Получив точки пересечения, вернитесь к исходному черно-цветному изображению, чтобы классифицировать их для подсчета. Фильтрация и поиск пересечений остаются очень эффективными для каждого пикселя. Классификация не так эффективна для каждого пикселя, но выполняется только в нескольких точках.
Вы можете сделать свертку, основанную на следующем ядре FIR-фильтра ...
.*.
***
.*.
Точки - это нули (нерелевантные пиксели) или, возможно, отрицательные значения (предпочитают черный). Звездочки имеют положительные значения (предпочитают белый). То есть ищите кресты три на три на перекрестках.
Затем вы сканируете отфильтрованный результат в поисках пикселей в градациях серого, которые ярче, чем какой-либо порог, что наилучшим образом соответствует вашему шаблону. Если вам действительно нужны только точные точки пересечения, вы можете принять только цвет с идеальным соответствием, но вы можете сделать поправки на соединения в стиле Т и т. Д.