ПИЛ: Можно ли заполнить маску? - PullRequest
2 голосов
/ 22 февраля 2011

Предположим, у меня есть маска (пустой треугольник - 1/255 / и т. Д. В треугольнике, 0 в другом месте), и у меня есть текстура, которую я хотел бы разместить внутри этого треугольника, но текстура является последовательной, а не форматируется в формат изображения. Например, если поле, содержащее треугольник / маску, имеет размер 100 x 100, но сам треугольник имеет только 2500 пикселей, у меня есть информация только для 2500 пикселей вместо фактического поля.

Итак, я мог заполнить треугольник вручную, выполняя каждую строку или столбец за раз, но мне было интересно, есть ли способ сделать это вместо этого.

Вот код, который я использовал в любом случае:

def fill_mask(mask, data): #mask and data are ndarrays
    mask = np.copy(mask).T
    k = 0
    for i in xrange(len(mask)):
        for j in xrange(len(mask[i])):
            if mask[i][j] == 1:
                mask[i][j] = data[k]
                k += 1
    return mask.T

Это заполняется горизонтально (построчно). Чтобы заполнить по вертикали, уберите .T в первой и последней строках. Вероятно, это можно сделать короче, хотя я ужасен с этим, поэтому я просто оставлю все как есть. Любые улучшения также приветствуются.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

mask[mask==1] = data

0 голосов
/ 22 февраля 2011

Звучит так, будто вы спрашиваете, можете ли вы заполнить / изменить каждый пиксель треугольника, используя массив значений, не посещая также пиксели, которые вы не хотите заполнять, используя только данные изображения.

Если это так, то короткий ответ - нет.

Конечно, было бы возможно создать некоторый оптимизационный массив, который ссылался бы только на те пиксели, которые были частью треугольника, но для создания этого массива вам нужно было бы посетить каждый пиксель, так что это будет только экономия, если Вы должны посетить один и тот же набор много раз.

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

Если, с другой стороны, вы знаете размеры и положение треугольника в своей маске, вы можете рассчитать положение пикселей внутри треугольника. Для этого вам нужно изучить свою тригонометрию.

Если вы уже не знаете, как это сделать, я бы сказал, придерживайтесь посещения каждого пикселя, это будет хорошим опытом обучения. Если вам нужно улучшить производительность позже, путь станет более понятным, как только вы поймете основные понятия.

...