2016-05-14 2 views
0

Хорошо, ребята, я застреваю, пытаясь создать сопоставление гистограммы для двух изображений; образ шаблона и изображение назначения (назначение означает изображение, в котором я хочу совместить изображение шаблона). Вместо отображения совпадающего изображения я получаю пустое изображение. Я чувствую, что я измучен этим, поэтому я пришел к SO. Может ли кто-нибудь вести меня в правильном направлении?Соответствие исходного изображения целевому изображению в python

Любая помощь в правильном направлении будет оценена по достоинству.

def matching(template, target, numberOfBins=256): 

    templateHist, bins1 = np.histogram(template.flatten(), numberOfBins, density = False) 
    targetHist, bins2 = np.histogram(target.flatten(), numberOfBins, density = False) 
    cdfTemplate = templateHist.cumsum() #Cumulative distributed function 
    cdfTemplate = (255 * cdfTemplate/cdfTemplate[-1]) #normalize 
    cdfTarget = targetHist.cumsum() 
    cdfTarget = (255 * cdfTarget/cdfTarget[-1]).astype(np.float64) 
    im2 = np.interp(template.flatten(), cdfTemplate, bins1[:-1]) 
    im3 = np.interp(im2, cdfTarget, bins2[:-1]) 
    result = im3.reshape((template.shape)) 

    return result 
+1

Смотрите здесь: http://stackoverflow.com/q/32655686/1461210 –

+0

это означает, что cdfTemplate [-1] возвращает 0. – Li357

+1

сообщение об ошибке говорит вам, что 'cdfTemplate [-1]' является равный 0, что приводит к тому, что все элементы в 'cdfTemplate' становятся NaN. Это означает, что сумма 'templateHist' также должна быть равна 0. Труднее объяснить, почему это должно быть так, учитывая, что он состоит из подсчетов битов гистограммы, и автоматический выбор краев бункера гистограммы должен гарантировать, что по крайней мере один бит содержит ненулевой счетчик. Что такое «шаблон» и «цель»? Я предполагаю, что они маскированные массивы? –

ответ

0
  • Сообщение об ошибке говорит вам, что cdfTemplate[-1] равно нулю, что приводит все элементы в cdfTemplate становится пренебрежимо малых.
  • Работая в обратном направлении, это означает, что сумма templateHist также должна быть равна нулю.
  • templateHist содержит подсчеты, рассчитанные с template.flatten(). Поскольку вы не указали набор весов для np.histogram, нет никакого способа, чтобы любой из элементов в templateHist мог быть отрицательным. Поэтому templateHist должны быть все нули.
  • Вы также передаете положительное целое число как параметр bins в np.histogram, и вы не указали параметр range. Поэтому, если template содержит любые значения, то np.histogram должен автоматически выбирать набор краев бункера таким образом, чтобы по крайней мере один из счетчиков был положительным.
  • Если template содержит NaNs или бесконечные значения, вы должны получить ValueError, а не вектор всех ненужных подсчетов.
  • Поэтому логический вывод состоит в том, что template должен быть пустым массивом.
+0

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

+1

['np.histogram'] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.histogram.html) принимает параметр' range', который может использоваться для указания '(нижний, верхний)' пределы для диапазона краев бункера. В принципе, вы могли бы получить счетчик нулевых бинов, потому что вы передали два числа, так что все значения в 'template' вышли за пределы этого диапазона, но вы этого не сделали. –

+0

Вы абсолютно правы. Я отлаживаю свой код и узнал, как только будет выполнен первый второй оператор в моей функции * hist *, результат == 0. –