Я работаю в ноутбуке Jupyter. Сначала загрузите ваше изображение:
!wget https://i.stack.imgur.com/SJxo3.png
Затем создайте массив RGBA из вашей картинки:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('SJxo3.png').convert('RGBA')
arr = np.array(img)
Мы хотим, чтобы на вашем изображении был набор разных цветов, поэтому мы создаем набор:
colors=set()
for each in arr:
for EACH in each:
colors.add(tuple(EACH.tolist()))
Мы хотим зациклить эти цвета и выбрать область, в которой присутствует каждый цвет. Начнем с:
for index, each in enumerate(colors):
Теперь каждый цвет является кортежем, в этом цикле for в настоящее время кортеж, и нам нужен список, поэтому мы делаем:
color=[]
for EACH in each:
color.append(EACH)
Теперь мы создадим массив, содержащий логические значения, True, если соответствующий компонент RGBA совпадает с цветом, который мы сейчас проверяем:
boolarr=[]
for eachinarr2 in [arr == color]:
boolarr.append(eachinarr2)
Затем мы выбираем те пиксели, которые совпадают с цветом, который мы проверяем в данный момент, то есть все четыре компонента RGBA совпадают (поэтому у нас один и тот же цвет). Мы храним эти пиксельные кординаты в indexx
и INDEXX
.
featurepixels=[]
for indexx, eachh in enumerate(boolarr[0]):
for INDEXX, EACHH in enumerate(eachh):
if EACHH.all() == True:
featurepixels.append([indexx, INDEXX])
Теперь мы создаем сетку из нулей:
grid = np.zeros((len(arr[0]),len(arr)))
Мы меняем значение этой сетки с полными нулями на 1 в тех местах, где у нас есть пиксель от определенного цвета, который мы проверяем:
for eachhh in featurepixels:
grid[eachhh[1],eachhh[0]] = 1
Затем мы создаем цветовую карту пикселей того же цвета, эффективно выбирая эту часть изображения:
plt.figure()
plt.pcolormesh(grid)
Собираем все это вместе:
!wget https://i.stack.imgur.com/SJxo3.png
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('SJxo3.png').convert('RGBA')
arr = np.array(img)
colors=set()
for eachH in arr:
for eACH in eachH:
colors.add(tuple(eACH.tolist()))
for index, each in enumerate(colors):
if index < 30: # for debugging
color=[]
for EACH in each:
color.append(EACH)
boolarr=[]
for eachinarr2 in [arr == color]:
boolarr.append(eachinarr2)
featurepixels=[]
for indexx, eachh in enumerate(boolarr[0]):
for INDEXX, EACHH in enumerate(eachh):
if EACHH.all() == True:
featurepixels.append([indexx, INDEXX])
grid = np.zeros((len(arr[0]),len(arr)))
for eachhh in featurepixels:
grid[eachhh[1],eachhh[0]] = 1
plt.figure()
plt.pcolormesh(grid)
Здесь вы можете создавать различные цветовые группы, чтобы большее количество пикселей классифицировалось как принадлежащие к одной функции. В этой текущей версии одно небольшое различие в цвете пикселя заставляет его классифицироваться как отдельная особенность. Поэтому я предлагаю создать эти цветовые группы / категории. Или используйте изображение, где количество цветов мало, и один элемент состоит только из одних и тех же цветов. Надеюсь, это поможет.