Кажется, вы делаете какую-то задачу по обнаружению дефектов. Первое решение, которое приходит мне в голову - это методика регистрации изображений.
Сначала попробуйте сделать снимки в тех же условиях (освещение, угол камеры и ...) (одно из предоставленных изображений больше на 2 пикселя).
Затем вы должны зарегистрировать два изображения и сопоставить одно с другим, как это
![enter image description here](https://i.stack.imgur.com/0Ye6z.jpg)
Затем оберните их с помощью матрицы гомографии и сгенерируйте выровненное изображение, в этом случае результат будет следующим:
Затем возьмите разность выровненного изображения с изображением запроса и пороговое значение, в результате:
![enter image description here](https://i.stack.imgur.com/iJWS8.png)
Как я уже сказал, если вы попытаетесь сделать свои кадры более точными, результат регистрации будет лучше и обеспечит более точную производительность.
Коды для каждой части: (в основном взяты из здесь ).
import cv2
import numpy as np
MAX_FEATURES = 1000
GOOD_MATCH_PERCENT = 0.5
def alignImages(im1, im2):
# Convert images to grayscale
im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
# Detect ORB features and compute descriptors.
orb = cv2.ORB_create(MAX_FEATURES)
keypoints1, descriptors1 = orb.detectAndCompute(im1Gray, None)
keypoints2, descriptors2 = orb.detectAndCompute(im2Gray, None)
# Match features.
matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
matches = matcher.match(descriptors1, descriptors2, None)
# Sort matches by score
matches.sort(key=lambda x: x.distance, reverse=False)
# Remove not so good matches
numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
matches = matches[:numGoodMatches]
# Draw top matches
imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None)
cv2.imwrite("matches.jpg", imMatches)
# Extract location of good matches
points1 = np.zeros((len(matches), 2), dtype=np.float32)
points2 = np.zeros((len(matches), 2), dtype=np.float32)
for i, match in enumerate(matches):
points1[i, :] = keypoints1[match.queryIdx].pt
points2[i, :] = keypoints2[match.trainIdx].pt
# Find homography
h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
# Use homography
height, width, channels = im2.shape
im1Reg = cv2.warpPerspective(im1, h, (width, height))
return im1Reg
if __name__ == '__main__':
# Read reference image
refFilename = "vv9gFl.jpg"
imFilename = "uP3CYl.jpg"
imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR)
im = cv2.imread(imFilename, cv2.IMREAD_COLOR)
# Registered image will be resotred in imReg.
# The estimated homography will be stored in h.
imReg = alignImages(im, imReference)
# Write aligned image to disk.
outFilename = "aligned.jpg"
cv2.imwrite(outFilename, imReg)
для разности изображения и порогового значения:
alined = cv2.imread ("align.jpg", 0)
alined = alined [:,: 280]
b = cv2.imread("vv9gFl.jpg", 0 )
b = b[:, :280]
print (alined.shape)
print (b.shape)
diff = cv2.absdiff(alined, b)
cv2.imwrite("diff.png", diff)
threshold = 25
alined[np.where(diff > threshold)] = 255
alined[np.where(diff <= threshold)] = 0
cv2.imwrite("threshold.png", diff)
Если у вас много изображений и вы хотите выполнить задачу обнаружения дефектов, я предлагаю использовать Denoising Autoencoder для обучения глубокой искусственной нейронной сети. Подробнее здесь .