Код, который я запускаю, есть, но я полагаю, это потому, что я запускаю его на бит x32, есть идеи, как заставить его работать?

from PIL import Image
import numpy as np
from functools import reduce
import matplotlib.pyplot as plt
import time
from statistics import mean

def threshold(imgArray):
    balanceAr = []
    newArray = imgArray

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

    balance = (lambda x, y:x+y,balanceAr[:3])/len(balanceAr[:3])

    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] = 255
            else:
                eachPix[0] = 0
                eachPix[1] = 0
                eachPix[2] = 0
                eachPix[3] = 255
    return newAr


i = Image.open('test.png')
iar = np.array(i)


threshold(iar)

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


ax1.imshow(iar)


plt.show()

Ошибка, которую я получаю,

Строка 13, в пороге avgNum = reduce (lambda x, y: x + y, eachPix [: 3]) / len (eachPix [: 3]) IndexError: недопустимый индекс для скалярной переменной.

0
Mr Mohamed 2 Мар 2016 в 21:55
EachPix кажется скалярной переменной, а не списком. Вы не можете получить доступ к его индексам, если это не список.
 – 
Saba Jamalian
2 Мар 2016 в 21:59
Есть предложения, как заставить его работать?
 – 
Mr Mohamed
2 Мар 2016 в 22:01
Похоже, ваш код разработан для изображений RGB, которые представлены в виде массивов 3D (строки, столбцы, rgb), тогда как вы передаете ему монохромное изображение, которое преобразуется в массив 2D (строки, столбцы). Что такое iar.shape?
 – 
ali_m
3 Мар 2016 в 00:03
Снимок, который я сделал с помощью своей веб-камеры, и преобразовал его в серый цвет 50x50 пикселей
 – 
Mr Mohamed
3 Мар 2016 в 00:12

1 ответ

Лучший ответ

Ну, мне пришлось вместо этого использовать opencv, и он работает нормально, но не очень точно

import cv2

img = cv2.imread('test.png')

grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(grayscaled, 45, 255, cv2.THRESH_BINARY)

cv2.imshow('threshold',threshold)
cv2.imwrite("11.png", threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
Mr Mohamed 3 Мар 2016 в 00:53