пересекается изображение с маской в ​​магии - PullRequest
0 голосов
/ 06 января 2019

Я загрузил изображение в библиотеку scikit-image в Python. Я также создал маску с теми же размерами, что и изображение, и теперь я хочу пересечь маску с изображением, чтобы показывать только пиксели изображения, где маска не равна нулю. Как я могу сделать это, не повторяя пиксель за пикселем?

Нужно ли просто применить маску к изображению, как:

new_image = image[mask]

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

Ответы [ 2 ]

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

Поэлементное умножение действительно отлично работает:

from skimage import data
from matplotlib import pyplot as plt

image = data.coins()
mask = image > 128
masked_image = image * mask

fig, (ax0, ax1) = plt.subplots(nrows=1, ncols=2)
ax0.imshow(image, cmap='gray')
ax1.imshow(masked_image, cmap='gray')

enter image description here

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

Примечание 2 : вы также можете использовать scikit-image для сохранения изображений:

from skimage import io
io.imsave('masked_image.png', masked_image)
0 голосов
/ 07 января 2019

Вы можете сделать это так:

from skimage import data
import numpy as np
from PIL import Image

# Load coins data-set
im = data.coins()

# Make mask of where image is less than mid-grey
mask = im<128

# Set image black everywhere it was less than mid-grey
im[mask] = 0

# Set image mid-grey everywhere it was mid-grey or brighter
im[~mask] = 128

# Convert to PIL image and save
Image.fromarray(im).save('result.png')

Начальное изображение монет:

enter image description here

Результирующее изображение:

enter image description here

...