Операция, которую вы реализуете, является оператором в математической морфологии, который называется hit and miss .
. Он может быть очень эффективно реализован как композиция из двух эрозий.Если обнаруживаемая форма может быть разложена на несколько простых геометрических фигур (особенно это касается прямоугольников, которые можно быстро вычислить), оператор может быть еще более эффективным.
Вы найдете очень эффективные эрозии в большинстве процессов обработки изображений.библиотеки, например попробуйте OpenCV.В OpenCV также есть оператор попадания и пропуска, вот руководство по его использованию .
В качестве примера того, какой вывод ожидать, я сгенерировал простое тестовое изображение (слева), применил оператор удара и пропуска с шаблоном, который совпадает ровно в одном месте изображения (в центре), и снова с шаблоном, который нигде не соответствует (справа):
Я сделал это в MATLAB, а не в Python, потому что он у меня открыт и его проще всего использовать.Это код:
se = [1,1,1,1 % Defines the template
0,0,0,1];
img = [0,0,0,0,0,0 % Defines the test image
0,1,1,1,1,0
0,0,0,0,1,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0];
img = dip_image(img,'bin');
res1 = hitmiss(img,se);
res2 = hitmiss(img,rot90(se,2));
% Quick-and-dirty display
h = dipshow([img,res1,res2]);
diptruesize(h,'tight',3000)
hold on
plot([5.5,5.5],[-0.5,5.5],'r-')
plot([11.5,11.5],[-0.5,5.5],'r-')
Приведенный выше код использует оператор удара и пропуска, как я реализовал в DIPimage .Эта же реализация доступна в Python в PyDIP как HitAndMiss
(пока нет бинарной версии PyDIP, вам нужно скомпилировать ее самостоятельно):
import PyDIP as dip
# ...
res = dip.HitAndMiss(img, se)