2015-05-18 4 views
0

Я создал функцию энергии в python, которую я применяю к png-изображению. Тем не менее, я не получаю возвращаемое значение энергии при вводе параметров. Кто-нибудь может понять, почему это так? Спасибо!Функция энергии, не возвращающая значение

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

img=mpimg.imread('Image.png') 
#plt.imshow(img) 
#plt.show() 

im=np.array(img 


def E_generator(beta, eta, h): 
    """Generate energy function E and localized version of E. 
     E = h * \sum{x_i} - beta * \sum{x_i x_j} - eta * \sum{x_i y_i} 
    """ 
    def E(x, y): 
     """Calculate energy for matrices x, y. 
     """ 
     # sum of products of neighboring paris {xi, yi} 
     xxm = np.zeros_like(x) 
     xxm[:-1, :] = x[1:, :] # down 
     xxm[1:, :] += x[:-1, :] # up 
     xxm[:, :-1] += x[:, 1:] # right 
     xxm[:, 1:] += x[:, :-1] # left 
     xx = np.sum(xxm * x) 
     xy = np.sum(x * y) 
     xsum = np.sum(x) 
     return h * xsum - beta * xx - eta * xy 

    return E 

y = np.array(img) 
x = np.array(y) 

E_generator(0,1,1) 

Затем выход возвращается с: ".E>"

+2

'E_generator' возвращает функцию' E'. Кто называет 'E'? – Pynchia

+0

Он вышел с «E --- функцией --- и т. Д.», Просто стек не позволил мне распечатать все заявление – user4476006

ответ

2

Ваша функция E_generator возвращает функцию (Е); для получения результата вам нужно вызвать эту функцию, чтобы вы могли сделать что-то вроде:

print E_generator(0,1,1)(x, y) 
+0

Спасибо! Это вернуло результат 0, который не является значением, которое я искал ... Массив для моего изображения выглядит как '(300, 300, 3)' Я хотел бы изменить его, чтобы он был всего 300x300. Я попробовал «np.reshape (im, 300)», но он говорит, что общий размер массива должен быть неизменным. Есть ли у вас какие-либо предложения? – user4476006

+0

Предполагая, что последний размер равен rgb, вы можете просто взять среднее по этой оси img.mean (axis = 2). Если вы хотите, чтобы «надлежащее» означало, вам придется (img [:,:, 0] ** 2 + img [:,:, 1] ** 2 + img [:,:, 2] ** 2) "" 0.5 Если вы не хотите каким-то образом слить цвета, вам нужно объяснить, как вы хотите уменьшить размер вашего изображения – paddyg

+0

PS, если вы создаете E с (0,1,1) и запустите его на x = y = img, тогда он просто вернет сумму (img) - sum (img * img), сайт matplotlib говорит, что он преобразует RGB uint8 для float32 масштабируется от 0.0 до 1.0 – paddyg

Смежные вопросы