Учитывая, что вы фактически ищете точное соответствие числовым данным, разумное использование графических выражений может быть наиболее эффективным путем к решению. Примерно следуя вашему примеру, начнем с настройки исходных данных и целевого шаблона:
Image sourceData := RealImage("Source data", 4, 4096);
sourceData = Random();
Image targetPattern := RealImage("Target pattern", 4, 15);
targetPattern = sourceData.Index(icol + 1733, 0);
Затем мы готовим тщательно организованный поисковый буфер с одним выражением изображения:
Number targetSize = targetPattern.ImageGetDimensionSize(0);
Number searchBufferW = sourceData.ImageGetDimensionSize(0) - targetSize;
Image searchBuffer := RealImage("Search buffer", 4, searchBufferW, targetSize);
searchBuffer = sourceData.Index(icol + irow, 0);
Это упорядочивает все потенциально совпадающие подмножества исходных данных в вертикальных столбцах 2D-изображения. Наконец, мы делаем небольшую математику изображения, чтобы найти совпадение с целевым шаблоном, если он существует:
searchBuffer = Abs(searchBuffer - targetPattern.Index(irow, 0));
Image projectionVector := targetPattern.ImageClone();
projectionVector = 1.0;
Image searchResult := projectionVector.MatrixMultiply(searchBuffer);
Number posX, posY;
Number wasFound = (searchResult.Min(posX, posY) == 0);
String resultMsg = (wasFound) ? "Pattern found at " + posX : "Pattern not found";
OKDialog(resultMsg);
Первая строка даст точный ноль в каждом пикселе столбца буфера поиска, который соответствует целевому шаблону. Вертикальное суммирование поискового буфера и использование функции Min() для поиска нуля ускоряет поиск соответствия.
Обратите внимание на использование MatrixMultiply() для быстрой проекции вертикальной суммы. Это будет работать только для исходных данных типа Real (4 байта с плавающей запятой). Однако существуют несколько более сложные подходы к быстрому проецированию данных, которые также дадут довольно быстрый результат для любого числового типа данных.
Хотя этот подход проиллюстрирован для одномерного шаблона в одномерном наборе данных, этот подход, вероятно, можно распространить на одномерные и двумерные шаблоны в двухмерных и трехмерных наборах данных с помощью многомерного поискового буфера и более сложной индексации с использованием объектов ImageDataSlice, но это было бы тема для другого вопроса.
person
Mike Kundmann
schedule
17.01.2016