Как объединить два или более изображений в Matlab? - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно объединить несколько изображений (разных текстур) вместе. Я пробовал следующий код:

% Read 4d data
I1 = importdata('Img1.tif');    
I2 = importdata('Img2.tif');

% Extract a slice of the data
extractImg1 = I1(:,:,1); 
extractImg2 = I2(:,:,1); 

% compute image size
[ny1, nx1] = size(extractA1);
[ny2, nx2] = size(extractA2);

P1 = extractImg1 (round(ny1/2)-120:round(ny1/2)+120, round(nx1/2)-120:round(nx1/2)+120);
figure, imshow(P1); title('Img1');
P2 = extractImg2 (round(ny2/2)-120:round(ny2/2)+120, round(nx2/2)-120:round(nx2/2)+120);
figure, imshow(P2); title('Img2');

Пожалуйста, что мне делать дальше?

Во-вторых, объединенное изображение понадобится для лазерной печати. Таким образом, изображения не имеют одинаковых размеров в пикселях; Мне сказали, что объединять их не имеет смысла, так как это может немного снизить точность.

Тем не менее, у меня все еще есть чувство, что объединение изображений не будет неправильным, учитывая, что все они имеют одинаковое разрешение.

Мне нужен совет относительно того, стоит ли мне продолжать комбинацию. Большое спасибо заранее.

1 Ответ

0 голосов
/ 30 апреля 2018

Вы извлекли две области одинакового размера из двух изображений. Если вы хотите поместить их рядом на одном и том же изображении, используйте cat, или эквивалентно, используйте квадратные скобки []:

next_to_each_other = [P1,P2];
on_top_of_each_other = [P1;P2];

Но учтите, что вы можете собрать эти вещи вместе, даже если они не имеют одинаковые размеры. Например, если I1 равно N x M пикселей, а I2 равно N x KN вертикальным размером, как обычно в MATLAB), тогда вы все равно можете сделать [I1,I2] потому что вертикальный размер совпадает.

Если ни вертикальный, ни горизонтальный размеры не совпадают, вы можете заполнить единицу нулями (или любым другим подходящим значением), используя padarray, прежде чем соединять их вместе:

ny1 = size(I1,1);
ny2 = size(I2,1);
if ny1<ny2
   I1 = padarray(I1,[ny2-ny1,0,0],0,'post'); % The 0 is the value to pad
elseif ny2<ny1
   I2 = padarray(I2,[ny1-ny2,0,0],0,'post'); % The 0 is the value to pad
end
out = [I1,I2];

padarray также позволяет реплицировать данные в матрице вместо заполнения нулями. Прочитайте документацию, чтобы найти то, что подходит. padarray требуется набор инструментов для обработки изображений. Если у вас его нет, вы можете повторить его функциональность, создав массив с нулями соответствующего размера с помощью функции zeros и добавив его к изображению с помощью чего-то вроде [I1;zeros(ny2-ny1,size(I1,2),size(I1,3)].

...