Определить расстояние между объектами и его отражение - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь измерить расстояние между объектом и его отражением.Верхняя «линия» - это отражение.Ниже находится сам объект.Объект представляет собой спираль, это еще больше ухудшает вид на объект.Свет, который излучается на объект, отражает только частично и заставляет его выглядеть так, как будто объект изменит свой размер.Свет генерируется в камере замедленного движения (5000 изображений в секунду), которую бросают на объект, чтобы сделать его видимым.Объект постоянно движется (все оси).Я пытаюсь проанализировать его движение по этим изображениям.

Изображения с очень низким разрешением (15x20 пикселей).Я применил очки RAISR AI для увеличения изображений и повышения их качества.Кроме того, я применил фильтр размытия, чтобы помочь opencv в создании контуров.В конце я применяю контуры, чтобы отметить соответствующую область.

До улучшения:

enter image description here

После улучшения + Контуры:

enter image description here

Эта конкретная картина - одна из хороших.Проблема в том, что большинство из них выглядят так:

enter image description here enter image description here enter image description here enter image description here

Есть ли человек, у которого есть идея, как мне измерить расстояние между объектом и его отражением?

Мой последний подход не дал удовлетворительного результата.В этом я бы сделал перерыв над объектом.Проблема заключается в том, что объект (отраженное освещение для камеры) меняет свой размер.

enter image description here enter image description here enter image description here

Как бы я сделал что-то подобное?

enter image description here

У меня такой хороший босс.Я не хочу говорить ему, что не могу решить эту проблему.Помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Методы, основанные на двумерных корреляциях, предоставляют богатый набор возможностей для распознавания и определения местоположения объектов и отражений.

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

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

Существуют также методы, включающие проекцию на (в идеале) ортонормированный базисный набор, вейвлеты и т. Д.Эти методы работают лучше всего, когда базовый набор хорошо подходит для того, что вы хотите найти.Методы, основанные на преобразовании Фурье, хорошо работают, когда вы не выходите за пределы Найквиста и отвечаете основным соображениям SNR.Но, честно говоря, FT также является расширением базового набора.

Наконец, следует отметить, что никакой метод не может создать новую информацию.Если его нет во входных данных, никакой алгоритм и никакое количество кода не найдут его.

Хорошо, вот пример кода, демонстрирующий корреляции.

#!/usr/bin/python

import numpy as np
import matplotlib.pylab as plt
from scipy.signal import correlate2d

plt.figure( figsize=[6,8] )

im = plt.imread("temp.png")

# For simplicity of exposition, we just sum the three color channels.
im1 = np.sum(im,axis=2)

ny = 5
nx = 2

n1 = 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow(  im1 )
ax.set_title( 'raw' )
ax.set_aspect( 'equal' )

corr = correlate2d( im1, im1, boundary='symm', mode='same')

n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf(  corr, 20 )
ax.set_title( 'auto-correlation' )
ax.set_aspect( 'equal' )


for a in 0, 1:
    imtest = np.roll(im1,4,axis=a)
    corr = correlate2d( im1, imtest, boundary='symm', mode='same')

    n1 += 1
    ax = plt.subplot( ny, nx, n1 )
    ax.imshow( imtest )
    ax.set_title( 'roll axis %d'%a )

    n1 += 1
    ax = plt.subplot( ny, nx, n1 )
    ax.contourf(  corr, 20 )
    ax.set_title( 'correlation, roll axis %d'%a )
    ax.set_aspect( 'equal' )

    imtest = np.flip(im1,axis=a)
    corr = correlate2d( im1, imtest, boundary='symm', mode='same')

    n1 += 1
    ax = plt.subplot( ny, nx, n1 )
    ax.imshow( imtest )
    ax.set_title( 'flip axis %d'%a )

    n1 += 1
    ax = plt.subplot( ny, nx, n1 )
    ax.contourf(  corr, 20 )
    ax.set_title( 'correlation, flip axis %d'%a )
    ax.set_aspect( 'equal' )

plt.tight_layout()
plt.show()

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

Output from the sample code

См. Пример, приведенный внизу здесь: scipy.signal.correlate2d

0 голосов
/ 29 января 2019

Похоже, ваша главная проблема - низкое разрешение.Мне кажется, что RAISR AI - это однокадровое решение с суперразрешением.

У вас медленная камера, поэтому, возможно, у вас больше изображений, чем вам нужно.Тогда вы можете использовать многокадровый подход, как в opencv super resolution

При многокадровом подходе вы получаете больше реальной информации.однокадровый подход - это просто оценка дополнительной информации.

вы пометили этот вопрос : проблема может заключаться в том, что суперразрешение не является частью версии opencv python.Поэтому, возможно, вам понадобится обходной путь с ctypes или другим решением-оболочкой.

...