Обмен данными с одного канала на другой с использованием NumPy - PullRequest
0 голосов
/ 01 марта 2019

Я смотрел, как переключать каналы с BGR на RGB, и это подошло.Это работает, но я сбит с толку этим синтаксисом.Как этот тип обмена данными работает в NumPy точно?

Код из gist :

rgb = bgr[...,::-1]

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я не эксперт по Numpy и тому, как называются его операции, но я могу показать вам, как использовать различные методы нарезки (индексации?) Для некоторой обработки изображений.

В целом, на изображениях RGB,операции разделены запятыми и выглядят так:

newImage = oldImage[ROWSTUFF, COLUMNSTUFF, CHANNELSTUFF]

, где ROWSTUFF, COLUMNSTUFF и CHANNELSTUFF состоят из:

start:end:step

Итак, давайте немного обработаем это изображение:

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


А затем просто поймите, что ... - это сокращение для "оставив неуказанным ди"1010 *, поэтому

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

и

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

Ключевые слова : обработка изображений, обработка изображений, Python, Numpy, flip,флоп, реверс, шаг, начало, конец, диапазон, срез, срез, извлечение, масштаб, канал, реверс, BGR в RGB, RGB в BGR.

0 голосов
/ 01 марта 2019

... - это просто заполнитель, чтобы избежать синтаксической ошибки, а ::-1 означает обращение элементов массива по последнему измерению.

Например:

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]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...