2017-01-13 3 views
-2

В настоящее время я пытаюсь запрограммировать сценарий для моего школьного проекта. Предполагается, что один пиксель берется из питания камеры и измеряется в этом месте несколько раз (для шумоподавления). Часть моего кода, что я не удовлетворен в настоящее время выглядит следующим образом:Python script: создание рабочего цикла

canon.ScanXY(x,y) 
img_1 = canon.FetchImage(0, 1 * 1) 
canon.StopScan() 

canon.ScanXY(x,y) 
img_2 = canon.FetchImage(0, 1 * 1) 
canon.StopScan() 

... 

canon.ScanXY(x,y) 
img_xxx = canon.FetchImage(0, 1 * 1) 
canon.StopScan() 

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

img_final = (img_1 + img_2 + img_3 + ... + img_xxx) 

и, наконец, распечатать картинку из результата, используя

img = np.fromstring(img_final, dtype="uint8").reshape(8,8) 
fig, ax = plt.subplots() 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 
ax.set_xticklabels((0,1)) 
x=ax.imshow(img,cmap="gray") 

Код работает, но если я хочу что-то изменить, это займет много времени. До сих пор я работал с 64 или менее строками, но хочу уточнить результаты, поэтому мне понадобится гораздо больше итераций. Любая помощь будет оценена по достоинству.

+3

* «Я пытался петля функции, но не смогли сделать это так, что у меня есть другой результат от каждой итерации.» * - Пожалуйста, покажите, что вы пробовали, и где были проблемы. Как это не подходит для SO – UnholySheep

+0

Я думаю, вы говорите, что 'canon.FetchImage (0, 1 * 1)' возвращает строку, содержащую данные оттенков серого в пикселе (x, y)? Это верно? Являются ли данные в этой строке одним байтом? Кроме того, я предполагаю, что вы используете Python 2, поскольку в Python 3 вы будете использовать объекты 'bytes' вместо строк. –

+0

Функция FetchImage может хранить даже большие изображения, часть '1 * 1' означает размер изображения. Однако для нашего приложения нам нужен только один пиксель, и да, я допустил ошибку, так как я использую Python 3, он действительно использует объекты 'bytes'. И для предыдущего вопроса я попытался зациклить его с помощью функции 'for' – Dannyus

ответ

-1

Вам необходимо использовать functions.

Поместите свой код внутри функции следующим образом:

def get_image(x,y): 
    canon.ScanXY(x,y) 
    img = canon.FetchImage(0, 1 * 1) 
    canon.StopScan() 
    return img 

Назначает коду, функция get_image, которую вы можете запустить с

returned_image = get_image(dimension_x,dimension_y) 

Чтобы иметь возможность запускать эту массу (т.е. loop it), есть список для возвращаемых изображений.

Например:

for i in range(64): 
    img_final += get_image(x,y) 
+1

Как этот цикл, как хочет OP? – UnholySheep

+0

@UnholySheep, извините, я предположил, что это был легкий шаг оттуда, чтобы спеть функцию. Теперь он работает правильно. – tburrows13

+0

Как бы вы инициализировали 'img_final'? –

0

img_final должна быть сумма последовательности отдельных img-х гг. Аналогия с добавлением последовательности целых чисел, считанной из консоли будет:

final = int(input("First num: ")) 
for x in range(xxx-1): 
    num = int(input("Next num: ")) 
    final += num