Как сгенерировать маску с помощью функции Pillow's Image.load () - PullRequest
2 голосов
/ 08 июля 2019

Я хочу создать маску на основе определенных значений пикселей. Например: каждый пиксель, где B> 200

Кажется, что именно метод Image.load () мне нужен для идентификации пикселей с этими значениями, но я не могу понять, как извлечь все эти пиксели и создать из них изображение маски.

            R, G, B = 0, 1, 2

            pixels = self.input_image.get_value().load()
            width, height = self.input_image.get_value().size

            for y in range(0, height):
                for x in range(0, width):
                    if pixels[x, y][B] > 200:
                        print("%s - %s's blue is more than 200" % (x, y))
``

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Я хотел, чтобы вы избегали петель for и просто использовали Numpy.Итак, начиная с этого изображения:

enter image description here

from PIL import Image
import numpy as np

# Open image
im = Image.open('colorwheel.png')

# Make Numpy array
ni = np.array(im)

# Mask pixels where Blue > 200
blues = ni[:,:,2]>200

# Save logical mask as PNG
Image.fromarray((blues*255).astype(np.uint8)).save('result.png')

enter image description here

Если вы хотитесделайте замаскированные пиксели черными, используйте:

ni[blues] = 0
Image.fromarray(ni).save('result.png')

enter image description here


Вы можете сделать более сложные, составные тесты для диапазонов, таких как:

#!/usr/bin/env python3

from PIL import Image
import numpy as np

# Open image
im = Image.open('colorwheel.png')

# Make Numpy array
ni = np.array(im)

# Mask pixels where 100 < Blue < 200
blues = ( ni[:,:,2]>100 ) & (ni[:,:,2]<200)

# Save logical mask as PNG
Image.fromarray((blues*255).astype(np.uint8)).save('result.png')

enter image description here

Вы также можете создать условие для красных, зеленых и синих, а затем использовать Numpy's np.logical_and() и np.logical_or() для составных условий,например:

bluesHi = ni[:,:,2] > 200 
redsLo  = ni[:,:,0] < 50

mask = np.logical_and(bluesHi,redsLo)
1 голос
/ 08 июля 2019

Благодаря ответу Марка Сетчелла, я решил создать массив пустышек того же размера, что и мое изображение, заполненное нулями.Затем для каждого пикселя, где B> 200, я установил соответствующее значение в массиве равным 255. Наконец, я преобразовал массив Numpy в изображение PIL в том же режиме, что и мое входное изображение.

            R, G, B = 0, 1, 2

            pixels = self.input_image.get_value().load()
            width, height = self.input_image.get_value().size
            mode = self.input_image.get_value().mode

            mask = np.zeros((height, width))

            for y in range(0, height):
                for x in range(0, width):
                    if pixels[x, y][2] > 200:
                        mask[y][x] = 255

            mask_image = Image.fromarray(mask).convert(mode)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...