перемещать перекрывающиеся изображения друг над другом, чтобы получить точную разницу - PullRequest
2 голосов
/ 14 мая 2019

Я хочу получить изображение Разница для отпечатка, сделанного камерой.

Я пробовал многие решения с использованием библиотек Python: opencv, image-magic и т. Д.

Решение, которое я нашел для сравнения изображений, для большей точности:

  1. переместите изображение: слева направо и найдите минимальную разницу.
  2. переместите изображение: справа налево и найдите минимальную разницу.
  3. переместите изображение: сверху вниз и найдите минимальную разницу.
  4. переместите изображение: снизу вверх и найдите минимальную разницу.

Условие для захвата изображения: 1. Камера никогда не будет двигаться (установлена ​​на фиксированной подставке). 2. Объект помещается вручную на белый лист, поэтому объект никогда не будет правильно выровнен . (небольшое изменение угла каждый раз, так как это ручное управление)

Образец изображения, полученный с помощью камеры, для приведенного ниже кода:

Образец изображения 1: белые точки:

Image 1  as original image

Образец изображения 2: как исходное изображение

Image 2 with white dotes

Образец изображения 3: черные точки

enter image description here

Принятый вывод для печати с белыми точками недоступен, но он должен отмечать только разницу (дефект):

Accepted output

В настоящее время я использую следующую команду Image-magic для изменения изображения:

compare -highlight-color black -fuzz 5% -metric AE Image_1.png Image_2.png -compose src diff.png

Код:

import subprocess

# -fuzz 5% # ignore minor difference between two images

cmd = 'compare -highlight-color black -fuzz 5% -metric AE Input.png output.png -compose src diff.png '

subprocess.call(cmd, shell=True)

Вывод после разницы неверен, так как сравнение работает от пикселя к пикселю, он недостаточно умен, чтобы отмечать только реальную разницу:

output

Вышеупомянутое решение, которое я упомянул, будет работать для получения требуемой разницы в качестве выходных данных, но для сравнения таких изображений нет библиотеки или магической команды.

Любой код Python ИЛИ команда Image-magic для этого?

Ответы [ 2 ]

5 голосов
/ 14 мая 2019

Кажется, вы делаете какую-то задачу по обнаружению дефектов. Первое решение, которое приходит мне в голову - это методика регистрации изображений. Сначала попробуйте сделать снимки в тех же условиях (освещение, угол камеры и ...) (одно из предоставленных изображений больше на 2 пикселя).

Затем вы должны зарегистрировать два изображения и сопоставить одно с другим, как это

enter image description here

Затем оберните их с помощью матрицы гомографии и сгенерируйте выровненное изображение, в этом случае результат будет следующим:

enter image description here

Затем возьмите разность выровненного изображения с изображением запроса и пороговое значение, в результате:

enter image description here

Как я уже сказал, если вы попытаетесь сделать свои кадры более точными, результат регистрации будет лучше и обеспечит более точную производительность.

Коды для каждой части: (в основном взяты из здесь ).

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 для обучения глубокой искусственной нейронной сети. Подробнее здесь .

2 голосов
/ 14 мая 2019

Хотя вам не нужна обработка по точкам, здесь приведено сравнение поиска по образу с использованием Imagemagick.Он обрезает одно изображение после обрезки черного, а затем сдвигает меньшее, чтобы найти наилучшие местоположения совпадений с большим.

кадрирование изображения1:

convert image1.jpg -gravity north -chop 0x25 image1c.png


enter image description here

кадрирование и прокладка image2:

convert image2.jpg -gravity north -chop 0x25 -gravity center -bordercolor "rgb(114,151,157)" -border 20x20 image2c.png


enter image description here

выполнить поиск субизображения

compare -metric rmse -subimage-search image2c.png image1c.png null:
1243.41 (0.0189732) @ 22,20

Теперь сдвиньте и получите разницу между двумя изображениями

convert image2c.png image1c.png -geometry +22+20 -compose difference -composite -shave 22x20 -colorspace gray -auto-level +level-colors white,red diff.png


enter image description here

ДОПОЛНИТЕЛЬНО:

Если выЕсли вы хотите просто использовать сравнение, то вам нужно добавить -fuzz 15% к команде сравнения:

compare -metric rmse -fuzz 15% -subimage-search image2c.png image1c.png diff.png


Получаются два изображения.Разница изображения является первой, поэтому посмотрите на diff-0.png

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...