В настоящее время я пытаюсь реализовать GDT, описанный Felzenszwalb и Huttenlocher (http://www.cs.cornell.edu/~dph/papers/dt.pdf) внутри Python для алгоритма обработки изображений. Однако я использовал алгоритм, описанный в опубликованном им документе несколько лет назад, но получил ошибочные результаты. Я нашел реализацию C# здесь: https://dsp.stackexchange.com/questions/227/fastest-available-algorithm-for-distance-transform/29727?noredirect=1#comment55866_29727Обобщенное преобразование расстояния в Python
И преобразовал его в Python (что почти так же, как и раньше).
Это мой код:
def of_column(dataInput):
output = zeros(dataInput.shape)
n = len(dataInput)
k = 0
v = zeros((n,))
z = zeros((n + 1,))
v[0] = 0
z[0] = -inf
z[1] = +inf
s = 0
for q in range(1, n):
while True:
s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k]))/(2.0 * q - 2.0 * v[k]))
if s <= z[k]:
k -= 1
else:
break
k += 1
v[k] = q
z[k] = s
z[k + 1] = +inf
k = 0
for q in range(n):
while z[k + 1] < q:
k += 1
output[q] = ((q - v[k]) * (q - v[k]) + dataInput[v[k]])
return output
Я до сих пор не могу найти ошибку. Придавая алгоритму двоичный (булевский) массив numpy, он просто возвращает сам массив, а не Transform. Почему это не работает на Python?
Я получил его работу после нескольких часов и часов. Ответ, приведенный в ссылке выше реализации кода на C#, предполагает установку «белых» областей на очень большое число. Мой массив dataInput был булевым массивом (0, 1). Я заменил все 1s на 2^32, и он отлично работает. Чем выше число, тем более размытым. Чем ниже, тем больше похоже на источник, который он получает. – macskay
Ответ автоответчика и принятие собственного ответа - более постоянный способ показать, что эта проблема решена. –
. Ваш ответ может даже помочь вам получить ответы :) –