Я ищу некоторое понимание того, как лучше всего подойти к моей проблеме. Я сравниваю два разных изображения на предмет различий, но у меня возникает проблема с небольшими поступательными движениями.
У меня есть изображение "Евангелия", которое само по себе является "золотым стандартом": Евангелие image
Тогда у меня есть несколько разных снятых изображений для сравнения. Вот пример: пример изображения
Вот пример разницы, показывающей мою проблему: разность изображений
Как видите, они довольно маленькие , Теперь я различаю изображения, сначала изменив размер изображения до 32x32, вручную уменьшив контрастность на 100, а затем применив размытие с помощью OpenCV.
После этого я использую функцию Skimage 'Structure_integrity', чтобы вычитать и количественно определить различия между изображениями. Остальное только для просмотра.
import cv2
import numpy as np
from PIL import Image
from skimage.metrics import structural_similarity
def change_contrast(img, level):
img = Image.fromarray(img)
factor = (259 * (level + 255)) / (255 * (259 - level))
def contrast(c):
return 128 + factor * (c - 128)
return np.asarray(img.point(contrast))
# Open and preprocess the images
image_orig = cv2.imread(IMAGE_PATH)
image = cv2.resize(image, (32, 32))
image = change_contrast(image_orig, -100)
image = cv2.blur(image, (5, 5))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gospel_orig = cv2.imread(GOSPEL_PATH)
gospel = cv2.resize(gospel_orig, (32, 32))
gospel = change_contrast(gospel, -100)
gospel = cv2.blur(gospel, (5, 5))
gospel = cv2.cvtColor(gospel, cv2.COLOR_BGR2GRAY)
# Get image similarities and an output difference image
(score, diff) = structural_similarity(image, gospel, full=True)
print("Image similarity", score)
diff = (diff * 255).astype("uint8")
# Viewing stuff below
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
filled_gospel = cv2.cvtColor(gospel, cv2.COLOR_GRAY2BGR)
for c in contours:
area = cv2.contourArea(c)
if area > 40:
x,y,w,h = cv2.boundingRect(c)
cv2.drawContours(filled_gospel, [c], 0, (0,255,0), -1)
cv2.imshow('image', image)
cv2.imshow('gospel', gospel)
cv2.imshow('diff',diff)
cv2.imshow('filled gospel',filled_gospel)
cv2.waitKey(0)
Когда я делаю описанные выше шаги, вы можете увидеть некоторые переводческие различия между «Евангелием» и снятым изображением. Как лучше всего бороться с этим, так как я хочу получить различия только в черном цвете буквы, а не в том, насколько хорошо он выровнен?