EDIT:
Просто понял, что речь шла о поиске индексов всех пикселей, которые отличаются от белого ...
Для этого случая просто замените вычисление логического массива его функцией дополнения:
white = (img[:, :, :3] != 255).any(2)
или
просто добавьте ~
перед логическим массивом в np.where
:
coords = np.array(np.where(~white))[::-1].T
результат теста будет, следовательно, противоположным
Здесь я предполагаю "использование 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)
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')