2016-06-03 3 views
0

Я пытаюсь выполнить некоторые математические операции на одиночных пикселях с помощью PIL.PIL: пиксельные математические свойства

Из Интернета я мог загрузить изображение в 2d массив, как это:

from PIL import Image 
img_filename = "CNH.JPG" 
im = Image.open(img_filename) 
im = im.convert('L') 
pix = im.load() 

Я сделал некоторые изменения в единый aftwards значение пикселя, но когда я пытаюсь сделать разделение (даже если она возвращает целое число), он просто округляется до 0 или 255:

>>> i=30 
>>> j=45 
>>> pix[i,j] 
37 
>>> pix[i,j]+5 
42 
>>> pix[i,j]*2 
84 
>>> pix[i,j]/2 
0 
>>> pix[i,j]*2 
0 

кажется, проблема у меня есть, чтобы сделать с делениями.

Моя цель - нормализовать значения моих пикселей для плавания в диапазоне (0,1) вместо (0,255). Поэтому я бы просто разделил каждое значение пикселя на 255.

Все, что мне не хватает на языке Python?

Кроме того, для будущих работ я планирую реализовать некоторые алгоритмы извлечения и классификации признаков в Python. Является ли PIL правильным пакетом для этой цели?

Пример кода:

from PIL import Image 

img_filename = "yourimage.JPG" 
im = Image.open(img_filename) 
im = im.convert('L') 
pix = im.load() 

i=30 
j=45 

print(pix[i,j]) 
pix[i,j] = pix[i,j]+5 
print(pix[i,j]) 
pix[i,j] = pix[i,j]*2 
print(pix[i,j]) 
pix[i,j] = float(pix[i,j]/2) 
print(pix[i,j]) 
pix[i,j] = pix[i,j]*2 
print(pix[i,j]) 
+0

Я не могу воспроизвести вашу проблему. Доступна ли загрузка изображения? – Matt

+0

Я тоже не могу воспроизвести это. Пожалуйста, разместите изображение. – nwk

+1

Вы уверены, что ваша проблема не является [целочисленным делением в Python 2.X] (http://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point- в-питон)? –

ответ

0

Он отлично работает здесь:

In [15]: pix[i,j] 
Out[15]: 145 

In [16]: pix[i,j]+5 
Out[16]: 150 

In [17]: pix[i,j]/2 
Out[17]: 72 

In [18]: float(pix[i,j]/2) 
Out[18]: 72.0 

In [19]: pix[i,j] = float(pix[i,j]/2) 
In [20]: pix[i,j] 
Out[20]: 72 

Конечно, это целочисленное деление (следовательно 145/2 является 72, не 72.5). Если вы делите на 255, все выйдет 0 (за исключением самого 255, который выйдет 1.)

Если вы хотите плавать выход, разделить на поплавок (pix[i,j]/255.0), либо

from __future__ import division 

Чтобы получить результат деления двух целых чисел, по умолчанию указывается число с плавающей запятой.

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