Как ввести комплексные значения в функцию OpenCV cv.dft ()? - PullRequest
1 голос
/ 01 апреля 2019

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

Я следовал следующим инструкциям из исследовательской работы

Дескрипторы Фурье: дескрипторы Фурье обеспечивают способ кодирования границы изображения путем сопоставления каждогоположение пикселя (x, y) в комплексное число (x + iy).

  1. Записать значения координат каждого пикселя последовательно (перемещаясь по часовой стрелке вдоль фигуры)
  2. Построить комплексвектор с использованием значений координат, записанных на шаге 1, т. е. (x, y) → (x + iy).
  3. Возьмите ДПФ комплексного вектора

Пришла моя проблемана шаге 3

Это моя реализация

def get_dft(image):
    coordinates = cv.findNonZero(image)
    # the code below removes an unnecessary dimension
    coordinates = coordinates.reshape(coordinates.shape[0], 2)
    y = coordinates[:, 1] * 1j  # convert to complex numbers
    # the code below removes an unnecessary dimension
    y = y.reshape(coordinates.shape[0], 1)
    x = coordinates[:, 0].reshape(coordinates.shape[0], 1)
    # the statement below will convert from two separate arrays
    # to a single array with each element  
    # of the form [a + jb]
    t = x + y
    # below is where the error occurs
    dft = cv.dft(t, flags=cv.DFT_COMPLEX_INPUT) 

Это ошибка, которую я получаю

TypeError: Expected cv::UMat for argument 'src'

при преобразовании в

a = numpy.ndarray(t)

Я получаю

ValueError: sequence too large; cannot be greater than 32

Он хочет сказать, что существует более 32 измерений.Я не понимаю, почему это происходит

, и когда я пытаюсь как

a = numpy.ndarray([t])

, я получаю ошибку

TypeError: only integer scalar arrays can be converted to a scalar index

Короче говоря, я хочу выполнить следующие шаги:упомянутый в статье, создайте комплексный вектор, такой как

[[a+jb],[c+jd]...]    

и передайте его функции DFT.

1 Ответ

0 голосов
/ 02 апреля 2019

Я нашел решение проблемы как

def get_dft(image):
    coordinates = cv.findNonZero(image)
    coordinates = coordinates.reshape(coordinates.shape[0], 2).astype(float)
    y = coordinates[:, 1].reshape(coordinates.shape[0], 1)
    x = coordinates[:, 0].reshape(coordinates.shape[0], 1)
    t = cv.merge([x, y])  # used to convert to 2 channel
    dft = cv.dft(t, flags=cv.DFT_COMPLEX_INPUT)

Я попробовал все эти клочковатые API и все, что казалось, провалилось по причинам, которые я не понимаю, но, к счастью, OpenCV

cv.merge(...)

работал.

Для многоканального вывода требуется несколько входных массивов и объединений.

Также я попытался ввести комплексные числа в функцию API OpenCV

cv.dft(...)

это не был правильный способ ввода комплексных чисел. Документация OpenCV объясняет сложный ввод здесь

В нем говорится, что флаг cv.DFT_COMPLEX_INPUT

указывает, что ввод является сложным вводом. Если этот флаг установлен, вход должен иметь 2 канала. С другой стороны, по причине обратной совместимости, если вход имеет 2 канала, вход уже считается сложным

Обратите внимание, что проблема, с которой я также столкнулся, заключалась в преобразовании в два канала, произошедшего из-за того, что я неправильно понял структуру cv :: UMat (), которая требуется для ввода в функцию.

Резюме,
Если вы хотите ввести комплексные числа в функцию API OpenCV

cv.dft(...)

Ваш вход должен состоять из 2 каналов, для создания двухканального массива, функция OpenCV,

cv.merge(...)

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

...