Не удается преобразовать изображение PIL из массива Paint. NET в numpy - PullRequest
1 голос
/ 14 марта 2020

Я получаю ValueError в numpy при выполнении операций с изображениями. Кажется, проблема в том, что изображения, отредактированные Paint. NET, не имеют размера RGB при открытии с использованием PIL и преобразовании в массив numpy.

Вот пример: нарисуйте строку в MS Paint, сохраните его как файл PNG, откройте его в Paint. NET, затем используйте инструмент magi c, чтобы удалить белый фон, чтобы он был прозрачным. Затем используйте следующий код для исходного изображения PNG из MS Paint и отредактированного изображения PNG в Paint. NET:

numpy.asarray(Image.open(imagePath)).shape

Когда я попробовал это на исходном изображении из MS Paint, размеры изображения были (861, 1091, 3). Однако размеры изображения после удаления фона в Paint. NET - (861, 1091) вместо (861, 1091, 4) (4 из-за прозрачного слоя). Кажется, что оба изображения хорошо открываются в моем приложении для просмотра фотографий, так что на самом деле с изображением все в порядке.

Кто-нибудь сталкивался с этой проблемой раньше? Я использую принятое решение здесь для усреднения некоторых изображений, но оно не работает, так как изображения PNG из Paint. NET, похоже, отсутствует измерение RGB. Я новичок в PIL, но я не ожидал, что код не будет работать для некоторых изображений PNG. Что вызывает эту странную проблему?

1 Ответ

1 голос
/ 14 марта 2020

Если PIL дает вам изображение 861x1091, когда вы ожидаете изображение 861x1091x3, это почти наверняка, потому что это изображение палитры - см. здесь для объяснения.

Самое простое, что нужно сделать, если вам нужно 3-канальное изображение RGB, а не одноканальное изображение палитры, - преобразовать его в RGB при открытии:

im = Image.open(path).convert('RGB')
...