Это сложная проблема, потому что шаблон был специально разработан, чтобы его было трудно решить с помощью программного обеспечения.
Я предлагаю следующие шаги:
- Преобразование
img
и pattern
в двоичные изображения (уровни серого не являются частью числа). - Вычислить абсолютная разница
img
и pattern
. - Применение закрытие морфологическая операция для закрытия небольших промежутков.
Вот код:
import cv2
import numpy as np
# Read image and pattern as Grayscale images (output of cv2.imread is numpty array).
img = cv2.imread("recherche.png", cv2.IMREAD_GRAYSCALE)
pattern = cv2.imread("pattern.png", cv2.IMREAD_GRAYSCALE)
# Convert img and pattern to binary images (all values above 1 goes to 255)
_, img = cv2.threshold(img, 1, 255, cv2.THRESH_BINARY)
_, pattern = cv2.threshold(pattern, 1, 255, cv2.THRESH_BINARY)
# Compute absolute difference of img and pattern (result is 0 where equal and 255 when not equal)
dif = cv2.absdiff(img, pattern)
# Apply closing morphological operation
dif = cv2.morphologyEx(dif, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)));
dif = 255 - dif # Inverse polarity
# Display result
cv2.imshow('dif', dif)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат:
Как видите решение не идеальное, но получить идеальный результат очень сложно ...