Получение пикселей с изображения с использованием PIL - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы написать скрипт, который читает файл bmp и затем отмечает пиксели на осях x-y, где изображение имеет цвет, отличный от белого. Затем с этими данными сохраните их в файл .txt.

Я начал использовать библиотеку Pillow, но не нашел, как решить эту проблему. Я открыл файл bmp с помощью Подушки и попытался поиграться с модулями из Image, но не смог найти, как это сделать.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2019

EDIT: Просто понял, что речь шла о поиске индексов всех пикселей, которые отличаются от белого ...
Для этого случая просто замените вычисление логического массива его функцией дополнения:

white = (img[:, :, :3] != 255).any(2)

или

просто добавьте ~ перед логическим массивом в np.where:

coords = np.array(np.where(~white))[::-1].T

результат теста будет, следовательно, противоположным

enter image description here


Здесь я предполагаю "использование PIL" не является строгим требованием, а лишь признаком того, как вы пытались начать.

Тем не менее, вы можете сделать следующее, используя imread из imageio:

import numpy as np
from imageio import imread

img = imread(filename)
white = (img[:, :, :3] == 255).all(2)
coords = np.array(np.where(white))[::-1].T

запись в файл ascii может быть сделана как

with open('xycoordinates.txt', 'w') as f:
    for c in coords:
        f.write(f'{c[0]},{c[1]}\n')

Объяснение
img - это 3D-массив, имеющий форму (nr, nc, c), то есть количество строк, количество столбцов и RGBA-значений.
img[:, :, :3] == 255 возвращает логический массив той же формы, что и img, что указывает на компонентное сопоставление отдельных значений RGB (без учета A. Если A также должно быть 255, просто оставьте полные скобки индексации).
.all(2) уменьшает его до желаемого массива формы (nr, nc), устанавливая только те индексы в True, где полный RGBA-массив совпадает.

np.where(white) возвращает кортеж индексов строк и столбцов.
np.array() преобразует его в массив numpy, чтобы применить к нему индексирование и преобразование numpy.
Поскольку row/column является обратным порядком номенклатуры x/y, [::-1] меняет порядок двух индексных массивов. Преобразование на .T выполняется для вывода не двух массивов (x и y) из n индексов, а из n массивов (x, y) с индексами.

Пример

img = imread(samplefile)
plt.imshow(img)

enter image description here

white = (img == [255, 255, 255, 255]).all(2)

array([[False, False,  True, False, False, False],
       [False, False,  True,  True, False, False],
       [False,  True, False, False, False, False],
       [ True,  True, False, False, False, False],
       [False, False, False, False, False,  True]])

coords = np.array(np.where(white))[::-1].T

array([[2, 0],
       [2, 1],
       [3, 1],
       [1, 2],
       [0, 3],
       [1, 3],
       [5, 4]], dtype=int64)

plt.plot(*coords.T, 'ro')

enter image description here

0 голосов
/ 21 января 2019

Вы можете прочитать пиксели с Image.getpixel() из PIL.

Приведенный ниже код предоставит вам все небелые пиксели в виде списка 2D.

from PIL import Image

im = Image.open('x.bmp')

imageSizeW, imageSizeH = im.size

nonWhitePixels = []

for i in range(1, imageSizeW):
    for j in range(1, imageSizeH):
        pixVal = im.getpixel((i, j))
        if pixVal != (255, 255, 255):
            nonWhitePixels.append([i, j])

print(nonWhitePixels)
...