2015-06-01 3 views
-1

Я новичок в Python и этот код, который я собирался отображать только что получил от http://pythonprogramming.net/automated-image-thresholding-python/?completed=/thresholding-python-function/, я получаю эту ошибку:IndexError? что это и как это исправить

Warning (from warnings module): 
    File "C:/Users/User/Desktop/tolong aku/thresholding logic.py", line 15 
    avgNum = reduce(lambda x, y: x + y, eachPix[:3])/len(eachPix[:3]) 
RuntimeWarning: overflow encountered in ubyte_scalars 

Warning (from warnings module): 
    File "C:/Users/User/Desktop/tolong aku/thresholding logic.py", line 21 
    if reduce(lambda x, y: x + y, eachPix[:3])/len(eachPix[:3]) > balance: 
RuntimeWarning: overflow encountered in ubyte_scalars 

Traceback (most recent call last): 
    File "C:/Users/User/Desktop/tolong aku/thresholding logic.py", line 41, in <module> 
    iar = threshold(iar) 
    File "C:/Users/User/Desktop/tolong aku/thresholding logic.py", line 25, in threshold 
    eachPix[3] = 0 
IndexError: index 3 is out of bounds for axis 0 with size 3 

, как я могу это исправить и что такое не так ли?

это мой питон 2.7 кода на окнах ..

# if you are on 32 bit OS: 
#import Image 

from PIL import Image 
import numpy as np 
import matplotlib.pyplot as plt 
import time 

def threshold (imageArray): 
    balanceAr = [] 
    newAr = imageArray 

    for eachRow in imageArray: 
     for eachPix in eachRow: 
      avgNum = reduce(lambda x, y: x + y, eachPix[:3])/len(eachPix[:3]) 
      balanceAr.append(avgNum) 
    balance = reduce(lambda x, y: x + y, balanceAr)/len(balanceAr) 

    for eachRow in newAr: 
     for eachPix in eachRow: 
      if reduce(lambda x, y: x + y, eachPix[:3])/len(eachPix[:3]) > balance: 
       eachPix[0] = 255 
       eachPix[1] = 255 
       eachPix[2] = 255 
       eachPix[3] = 0 

      else: 
       eachPix[0] = 0 
       eachPix[1] = 0 
       eachPix[2] = 0 
       eachPix[3] = 255 

    return newAr 

i = Image.open ('C:/Users/User/Desktop/tolong aku/50.0.png') 
iar = np.array(i) 

i2 = Image.open ('C:/Users/User/Desktop/tolong aku/50.1.png') 
iar2 = np.array(i2) 

iar = threshold(iar) 
iar2 = threshold(iar2) 

fig = plt.figure() 
ax1 = plt.subplot2grid((8,6), (0,0), rowspan=4, colspan=3) 
ax2 = plt.subplot2grid((8,6), (4,0), rowspan=4, colspan=3) 

ax1.imshow(iar) 
ax2.imshow(iar2) 

plt.show() 

я хочу, чтобы повернуть изображение на серый пиксел, а затем собирать результаты массива, чтобы сделать set..tq данных.

+0

Я на самом деле просто новичок в python.i уже прочитал базовый python, такой как http://www.python-course.eu/ course.php, http://www.tutorialspoint.com/python/index.htm, https://samarthbhargav.wordpress.com/2014/05/05/image-processing-with-python-rgb-to-grayscale- преобразование/.so, я очень сожалею о том, что задал такой типичный вопрос, как this.very оценить все помогает. – Amr

ответ

0

Ошибки индекса появляются при попытке получить элемент последовательности (например, список или кортеж) и использовать индекс из диапазона существующих элементов.

Например.

t = (1, 2, 3)  # has elements at indices 0, 1, and 2 

Если вы попытаетесь получить доступ к элементу 3 или 4, вы получите индексную ошибку. Существуют только элементы t [0], t [1] и t [2].

[[[ 78 84 84] [172 181 181] [188 196 198] ..., [111 116 113] [ 62 65 62] [ 64 66 63]] then, i can only use how many pix?

означает, что внутренний индекс может считаться 2: элементами [0], [1] и [2]. Следующий индекс может идти от 0 до (количество триплетов - 1)

+0

это так, то это значит, что данные моего массива, если он содержит такие элементы, как это, [[[78 84 84] [172 181 181] [188 196 198] ..., [111 116 113] [62 65 62] [64 66 63]] , тогда я могу использовать только количество пикселей? – Amr

+0

См. Править выше. – jcoppens

+0

ОК, поэтому я изменил значение [3] на [2], то почему выходное изображение отображает только синий и белый цвет? Могу ли я изменить его на серые пиксели? Или я могу просто сохранить синее изображение для использования для всех данных? – Amr

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