Użyj numpy do maskowania obrazu wzorkiem?

głosy
15

Używam numpy zbudować tablice pikseli. 800x600 obraz jest 3-wymiarowa tablica uint8, 800x600x3. Mam też podobną tablicę z ustalonym wzorem szachownicy (patrz tutaj ). Muszę kolejną tablicę, 800x600 wartości maski. Gdzie maska jest zero, chcę skopiować wzór piksel do piksela obrazu. W przypadku, gdy maska nie jest zerem, chcę zostawić piksel obrazu.

>>> image.shape
(800, 600, 3)
>>> chex.shape
(800, 600, 3)
>>> mask.shape
(800, 600)

To czuje się jak to powinno działać:

image[mask == 0,...] = chex

ale daje „ValueError: tablica nie jest broadcastable skorygować kształt”.

Czego używać do kopiowania chex pikseli pikseli obrazu, gdzie maska ​​jest zerowy?

Utwórz 30/01/2010 o 20:57
użytkownik
W innych językach...                            


5 odpowiedzi

głosy
0

Próbować:

image[mask[:] == 0,...] = chex[mask[:] == 0,...]
Odpowiedział 30/01/2010 o 21:21
źródło użytkownik

głosy
13

idx=(mask==0)
image[idx]=chex[idx]

Należy pamiętać, że imagema kształt (800,600,3), natomiast idxma kształt (800,600). Zasady dotyczące stanu indeksowania

Jeżeli wybór krotka jest mniejsza niż N, to w wielu: Przedmioty są dodawane w miarę potrzeby do końca krotki selekcji, tak, że zmodyfikowany wybór krotka ma długość N.

Tak więc tablice indeksujące mają pewnego rodzaju zdolności nadawania własnych. idx„s kształt awansuje do (800,600, :)

Odpowiedział 30/01/2010 o 23:17
źródło użytkownik

głosy
0

Użyłem tablice 8x6x3, 8x6x3, 8x6 i reprezentować swoją tablicę obrazu, tablicę sprawdzania i tablicę maski odpowiednio.

# first create mini-versions of your arrays:
mask = NP.random.random_integers(0, 1, 48).reshape(8, 6)
img = NP.random.random_integers(3, 9, 8*6*3).reshape(8, 6, 3)
chk = NP.ones((8, 6, 3))

# all the work done in these two lines
mask = mask[:,:,NP.newaxis]
res = NP.where(mask==0, chk, img)
Odpowiedział 31/01/2010 o 01:48
źródło użytkownik

głosy
0

Chciałem zilustrować przykład stosując @unutbu odpowiedź. W tym scenariuszu, mam obraz kota, że ​​obraca się. Obrót ten powoduje pewne czarne krawędzie, które wyglądają brzydko zwłaszcza po wklejeniu na non-czarnym tle.

import matplotlib.pyplot as plt
from scipy.ndimage import rotate


cat = plt.imread('cat.jpeg')
bg = plt.imread('background.jpeg')


rotcat = rotate(cat, angle=8, reshape=True) ## rotating creates some black edges
height, width, _ = rotcat.shape

bgcopy = bg.copy() ## create a copy of the background; paste on copy

x, y = 40, 50 
bgcopy[x:x+height, y:y+width] = rotcat
plt.imsave('cat-on-bg-mask.jpg', bgcopy)

złe wklejanie

Więc uważam, że obszary maski i zastąpić te wartości z oryginalnych wartości tła

mask_ind = (bgcopy == 0)
bgcopy[mask_ind] = bg[mask_ind]
plt.imsave('cat-on-bg.jpg', bgcopy)

dobry wklejanie

Należy również pamiętać, że PIL.Image(z Pillowbiblioteki) ma możliwość wkleić zdjęcie na inny obraz z mniejszą liczbą etapów.

Odpowiedział 21/05/2018 o 00:16
źródło użytkownik

głosy
0

I okazało się, że najłatwiej utworzyć maskę gdzie 1 = „pixel aby utrzymać” i 0 = „pixel do usunięcia”.

Potem mój obraz mnożone przez tę maskę, aby usunąć niechciane pikseli. Przykład zachować tylko przez jedną ramkę (na zewnątrz) portretu:

from scipy.misc import imread
import matplotlib.pyplot as plt
import numpy as np

im = imread('portrait.jpg', mode='L') # read in image
plt.imshow(im) # show the original image

wprowadzić opis obrazu tutaj

mask = np.ones(im.shape) # create a mask with the image's shape
bw = 0.1 # identify border width and height as fraction of image size
bx = int(im.shape[1] * bw) # get the x dimension border width
by = int(im.shape[0] * bw) # get the y dimension border height
mask[bx:-bx,by:-by] = 0 # create a mask with 1 for border and 0 for inside

masked = im * mask # multiply `im` by the mask to zero out non-border pixels
plt.imshow(masked) # show the result of the masking operation

wprowadzić opis obrazu tutaj

Odpowiedział 21/05/2019 o 02:34
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more