У меня странная проблема с моим кодом Python.Я передаю цветное изображение в черно-белое изображение.
Я использую PIL для работы с изображениями, это моя функция:
class ImageEffects():
def __init__(self, h, w, img):
self.h = h
self.w = w
self.img = img
def grayScale(self):
ret = [[(0, 0, 0) for x in range(self.h)] for y in range(self.w)]
last = []
try:
for y in range(self.h):
for x in range(self.w):
if self.inside(x, y):
pixel = self.img[x, y]
newColor = int((pixel[0] + pixel[1] + pixel[2])/3)
ret[y][x] = (newColor, newColor, newColor)
last = [x, y, self.inside(x, y), self.h, self.w]
except Exception as err:
print(err)
print(last)
return np.array(ret, dtype=np.uint8)
def inside(self, x, y):
return 0 <= x < self.w and 0 <= y < self.h
Я использовал некоторые попытки, кроме какпонять проблему.Теперь я вызываю это следующим образом:
im = Image.open(destination) # open the image to work
matrixImg = im.load()
h, w = im.size # size images
newEffects = ImageEffects(h, w, matrixImg)
gray = newEffects.grayScale()
new_image = Image.fromarray(gray)
destination = "/".join([target, userId, "gray_" + fileHashed])
new_image.save(destination)
Попробуйте с этим образом: (https://i.imgur.com/XuwgsC3.jpg) Я получил (https://i.imgur.com/4jpgrzm.png), и это мой журнал исключений в консоли:
image index out of range # first print exception in grayscale function
[1114, 1114, True, 1280, 1115] # second print exception in grayscale function
Но я не понимаю, почему индекс выходит за пределы диапазона.
Может быть, я так устал, что не вижу ошибки, но не могли бы вы мне помочь? Спасиботак много, ребята!
ОБНОВЛЕНИЕ: Я ПОЛУЧИЛ РЕШЕНИЕ!
class ImageEffects():
def __init__(self, size, img):
self.size = size
self.img = img
def grayScale(self):
ret = [[(0, 0, 0) for x in range(self.size[0])] for y in range(self.size[1])]
last = []
try:
pixels = self.img.load()
for x in range(self.size[0]):
for y in range(self.size[1]):
if self.inside(x, y):
pixel = pixels[x, y]
newColor = abs(int((pixel[0] + pixel[1] + pixel[2])/3))
ret[y][x] = (newColor, newColor, newColor)
last = [x, y, self.inside(x, y), self.size]
except Exception as err:
print(last)
print(err)
return np.array(ret, dtype=np.uint8)
def inside(self, x, y):
return 0 <= x < self.size[0] and 0 <= y < self.size[1]
Это работает, я передаю объект "Image.open (file)" в img param класса ImageEffects. ЗатемЯ не знаю, где большая разница между двумя кодами.