обнаружение формы - PullRequest
       19

обнаружение формы

1 голос
/ 22 января 2020

Я испробовал 3 алгоритма:

  1. Сравнить с помощью Compare_ssim.
  2. Обнаружение различий по PIL (ImageChops.difference).
  3. Вычитание изображений.

Первый алгоритм:

(score, diff) = compare_ssim(img1, img2, full=True)
diff = (diff * 255).astype("uint8")

Второй алгоритм:

from PIL import Image ,ImageChops
img1=Image.open("canny1.jpg")
img2=Image.open("canny2.jpg")
diff=ImageChops.difference(img1,img2)
if diff.getbbox():
    diff.show()

Третий алгоритм:

image3= cv2.subtract(image1,image2)

Проблема заключается в этих алгоритмах так чувствительны Если изображения имеют разные шумы, они считают, что эти два изображения совершенно разные. Есть идеи, чтобы это исправить?

Ответы [ 3 ]

3 голосов
/ 22 января 2020

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

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

enter image description here

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

1 голос
/ 22 января 2020

Очень трудно помочь, так как мы не знаем, какие параметры вы можете изменить, например, можете ли вы сохранить свою камеру фиксированной? Это всегда будет только о трубах? А как насчет цветов труб?

Тем не менее, я думаю, что вы ищете, это фреймворк для регистрации изображений, и я предлагаю вам использовать SimpleElastix . Он в основном используется для медицинских изображений, поэтому вам, возможно, придется ознакомиться с библиотекой SimpleITK. Что интересно, у вас много параметров для контроля регистрации. Я думаю, что вам придется заглянуть в документацию, чтобы узнать, как управлять определенной частотой c изображения, той, которая создает волны и деформирует изображения. В дальнейшем я не настроил его на достаточное локальное искажение, вам нужно будет найти лучший компромисс, но я думаю, что он должен быть достаточно гибким.

В любом случае, вы можете получить такой результат с помощью следующего кода Я не знаю, поможет ли это, надеюсь, что так:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import SimpleITK as sitk

fixedImage = sitk.ReadImage('1.jpg', sitk.sitkFloat32)
movingImage = sitk.ReadImage('2.jpg', sitk.sitkFloat32)

elastixImageFilter = sitk.ElastixImageFilter()

affine_registration_parameters = sitk.GetDefaultParameterMap('affine')
affine_registration_parameters["NumberOfResolutions"] = ['6']
affine_registration_parameters["WriteResultImage"] = ['false']
affine_registration_parameters["MaximumNumberOfSamplingAttempts"] = ['4']

parameterMapVector = sitk.VectorOfParameterMap()
parameterMapVector.append(affine_registration_parameters)
parameterMapVector.append(sitk.GetDefaultParameterMap("bspline"))

elastixImageFilter.SetFixedImage(fixedImage)
elastixImageFilter.SetMovingImage(movingImage)
elastixImageFilter.SetParameterMap(parameterMapVector)
elastixImageFilter.Execute()

registeredImage = elastixImageFilter.GetResultImage()
transformParameterMap = elastixImageFilter.GetTransformParameterMap()

resultImage = sitk.Subtract(registeredImage, fixedImage)
resultImageNp = np.sqrt(sitk.GetArrayFromImage(resultImage) ** 2)

cv2.imwrite('gray_1.png', sitk.GetArrayFromImage(fixedImage))
cv2.imwrite('gray_2.png', sitk.GetArrayFromImage(movingImage))
cv2.imwrite('gray_2r.png', sitk.GetArrayFromImage(registeredImage))
cv2.imwrite('gray_diff.png', resultImageNp)

Ваше первое изображение изменено до 256x256:
first image
Ваше второе изображение:
second image
Ваше второе изображение, зарегистрированное под первым:
second image registered
Вот разница между первым и вторым изображением, которое могло показать, что отличается:
difference

0 голосов
/ 22 января 2020

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

Вы можете уменьшить шум двумя способами: а) сделать несколько снимков тот же объект, так что объект не меняется. Вы можете складывать изображения, и шум уменьшается на квадрат root от количества изображений. б) Вы можете запустить фильтр размытия по изображению. Чем больше размытия, тем больше шума усредняется. Шум здесь уменьшается на квадрат - root от количества пикселей, которое вы усредняете. Но так же подробно на изображениях.

В обоих случаях (a) и (b) вы запускаете анализ различий после того, как применили любой из этих методов.

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

Существует еще один третий вариант, более высокий уровень: запустить ваш объект анализ сначала на достаточно детальном уровне. И сравните результаты.

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