Объединить два изображения в измерении канала? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно объединить два изображения в измерении канала в MATLAB или Python.

Допустим, мы берем два входных изображения в оттенках серого, каждое из которых имеет, например, размер [1, 1, 28, 28] (то есть 1 изображение, 1 канал, разрешение 28x28). Как мы можем объединить их в одно изображение размером [1, 2, 28, 28]?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

В MATLAB вы обычно используете команду cat для этого:

bigMat = cat(dimNo, matA, matB); % dimNo can be 1, 2, ...

Но в случае конкатенации по измерению 2 и вы также можете просто использовать [... ; ...]:

bigMat = [matA; matB];

(что эквивалентно функции vertcat).

Если вы заранее знаете, сколько матриц вы хотите объединить (т. Е. Окончательный размер результата), вы должны предварительно выделить матрицу, используя, например, bigMat = zeros(1, N, 28, 28), затем поместите каждое изображение в правильное положение, аналогично предыдущему ответу -

img1(:,n,:,:) = img2; % where n is 1..N, and not anything like end+1

Мы не хотим использовать end+1, так как это приводит к потерям производительности, связанным с постоянным перераспределением больших и больших массивов и копированием всего содержимого массива каждый раз.

0 голосов
/ 08 ноября 2018

Python: используйте numpy для этой операции:

import numpy as np
img1, img2 = np.random.rand(1,1,28,28), np.random.rand(1,1,28,28)
img = np.concatenate([img1, img2], axis=1)

Аргумент axis=1 определяет ось, вдоль которой выполняется операция.

0 голосов
/ 08 ноября 2018

Я не уверен, что вы хотите сделать со своим первым размером, но это работает для вашего примера:

img1 = randi(255,1,1,28,28); % first image
img2 = randi(255,1,1,28,28); % second image

img1(1,end+1,:,:) = img2; % stack second image on top of first image
size(img1) % [ 1 2 28 28]
...