Patrzyłem na jak zmienić kanały z BGR do RGB, a to pojawiło się. To działa, ale jestem zaskoczony przez tę składnię. W jaki sposób ten typ wymiany danych działa dokładnie w numpry?

Kod z GIST:

rgb = bgr[...,::-1]
2
dev_nut 1 marzec 2019, 23:16

2 odpowiedzi

Najlepsza odpowiedź

Nie jestem ekspertem od numpry i jak nazywa się jego operacje, ale mogę pokazać, jak korzystać z różnych krojenia (indeksowanie?) Techniki, aby wykonać przetwarzanie obrazu.

Ogólnie rzecz biorąc, na obrazach RGB operacje są oddzielone przecinkami i wyglądają tak:

newImage = oldImage[ROWSTUFF, COLUMNSTUFF, CHANNELSTUFF]

Gdzie robią Rowstuff, ColankStuff i ChannStStuff z:

start:end:step

Zróbmy trochę przetwarzania na tym obrazie:

enter image description here

# Load image with PIL/Pillow and make Numpy array - you can equally use OpenCV imread(), or other libraries
im = np.array(Image.open('start.png').convert('RGB'))                                           

# im.shape is (400, 400, 3)

# Now extract top half by ending ROWSTUFF at 200
tophalf = im[:200,:,:]

enter image description here


# Now extract bottom half by starting ROWSTUFF at 200
bottomhalf = im[200:,:,:] 

enter image description here


# Now extract left half by ending ROWSTUFF at 200
lefthalf = im[:,:200,:]

enter image description here


# Now extract right half by starting ROWSTUFF at 200
righthalf = im[:,200:,:]  

enter image description here


# Now scale the image by taking only every 4th row and every second column:
scaled = im[::4,::2,:]

enter image description here


# Now extract Red channel, by setting CHANNELSTUFF to 0
red = im[:,:,0]

enter image description here


# Now extract Green channel, by setting CHANNELSTUFF to 1
green = im[:,:,1] 

enter image description here


# Now flop the image top to bottom by striding backwards through ROWSTUFF
flop = im[::-1,:,:]

enter image description here


# Now flip the image left to right by striding backwards through COLUMNSTUFF
flip = im[:,::-1,:]  

enter image description here


# And finally, like the question, reverse the channels by striding through CHANNELSTUFF backwards, which will make RGB -> BGR, thereby leaving Green and black unchanged
OP = im[:,:,::-1]  

enter image description here


A następnie zdaj sobie sprawę, że ... jest skrótem dla "pozostawiając nieokreślone wymiary, ponieważ są" , więc

[:,:,:,:, a:b:c] can be written as [..., a:b:c]

I

[a:b:c, :,:,:,:,:] can be written as [a:b:c, ...]

słowa kluczowe : przetwarzanie obrazu, proces, obraz, python, numpy, flip, flop, odwrotny, krok, początek, końcowy, zakres, plasterka, krojenie, ekstrakt, skala, kanał, odwrotny, BGR do RGB, RGB do BGR.

3
Mark Setchell 2 marzec 2019, 12:29

... to tylko symbol zastępczy, aby uniknąć błędu składniowego, a ::-1 oznacza odwrócić elementy tablicy wzdłuż ostatniego wymiaru.

Na przykład:

In [4]: rgb = np.arange(12).reshape(2,2,3)

In [5]: rgb
Out[5]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])
In [8]: rgb[...,::-1]
Out[8]: 
array([[[ 2,  1,  0],
        [ 5,  4,  3]],

       [[ 8,  7,  6],
        [11, 10,  9]]])
3
user545424 1 marzec 2019, 20:57