2016-12-20 6 views
1

Я загрузил изображение в виде пиксельных данных в массив numpy (subjectImage). Следующие строки кода успешно восстанавливает Numpy массив обратно в изображение и отображает его:Масштабирование изображения в массиве numpy не может быть отменено

subjectImagePath = 'pathToFile/cat.0.jpg'   
subjectImage = misc.imresize(misc.imread(subjectImagePath), (224,224,3)) 
img = Image.fromarray(subjectImage, 'RGB') 
img.show() 

Однако, если я масштабировать значения пикселей изображения между 0 и 1, то я не в состоянии восстановить изображение обратно к его первоначальной форме. (Он отображает кучу шума)

subjectImage = subjectImage/255 
subjectImage = subjectImage*255 
img = Image.fromarray(subjectImage, 'RGB') 
img.show() 

Numpy даже сообщает мне, что массивы одинаковы.

orig = subjectImage 
subjectImage = subjectImage/255 
print(np.array_equal(orig, subjectImage*255)) # => Prints True 

Мне интересно, что могло бы вызвать это? Любая помощь будет замечательной!

библиотеки:

import numpy as np 
from PIL import Image 
from scipy import misc 
+1

Проверьте 'dtype' на разных этапах расчетов. – hpaulj

ответ

1

Проблема заключается в том, что массив после умножения и деления на 255 становится плавающей точкой массива:

>>> a = misc.imread(path) 
>>> a.dtype 
dtype('uint8') 
>>> b = a/255 
>>> b = b * 255 
>>> b.dtype 
dtype('float64') 

Я думаю, что функция img.show() не знает, как отобразить с плавающей точкой номера. Возможно, он интерпретирует поплавки как uint8, или некоторые из них, и пытается каким-то образом их отобразить. К сожалению, docs для img.show() ничего нам не говорят о том, как это работает. misc модуль

SciPy имеет свой собственный imshow, однако, что работает отлично:

>>> misc.imshow(b) 

На соответствующую записку, если вы думаете об использовании как scipy.misc и PIL/pillow одновременно, кажется, есть некоторые разница в том, как они обрабатывают массивы. См. Например, вопрос this.

+0

Похоже, что бит более высокого порядка выключен. Если я передам массив numpy в unsigned int, он устранит проблему. Благодаря! –

1

Интересный пример точечных представлений с плавающей и DTYPE ... Рассмотрим следующий пример. Вы можете распечатать массивы, чтобы увидеть, где существуют неравенства. Следующее упрощает результаты и сравнения.

>>> a = np.arange(5*5*3, dtype=np.int64) 
>>> b = a/(5*5) 
>>> c = b*(5*5) 
>>> d = np.around(b*(5*5)) 
>>> a[a!=c] 
array([ 7, 14, 28, 29, 55, 56, 57, 58]) 
>>> a[a!=d] 
array([], dtype=int64) 
+0

Я не думаю, что это проблема. Массивы OP проверяют равные ... Вероятнее всего, будет некоторая проблема с 'show()'. – Praveen

+0

@Praveen - это то, что показывает тест. Существуют неравенства, которые могут объяснять нечеткость, возможно show() обеспечивает правильное преобразование обратно. – NaN