Наложение png — изображения с прозрачными областями на другое изображение в MATLAB

#matlab

Вопрос:

У меня есть набор из 450 изображений jpg, каждое размером примерно 1200×1500 пикселей. Я хочу применить черную рамку к каждому изображению, чтобы сделать их все 1500×1500 пикселей.

Вот пример изображения: test01.jpg И я хочу превратить его в изображение, которое выглядит следующим образом: изображение 1500×1500 с рамкой

Я пытался это сделать, наложив изображение в формате png с черной рамкой поверх исходного изображения. Однако это сработало не очень хорошо 🙁 Вот мой код до сих пор:

 A = imread('test01.jpg'); %open image
A2 = imresize(A,[1500 1200]); %resize image to 1500 x 1200 just to make sure it is correct height
RA = imref2d(size(A2));
B = imread('cropper_and_outline_1500x1500.png'); %open cropper
RB = imref2d(size(B));
C = imfuse(A2,B,'blend','Scaling','joint'); %fuse images
imshow(C)
 

Вот мой текущий результат.
Есть несколько ошибок… а) черная граница не непрозрачна, б) прозрачный цвет установлен на зеленый, не прозрачный, в) два изображения выровнены в левом верхнем углу, но мне нужно, чтобы они были выровнены по центру.

Я играл с альфа-уровнем, чтобы попытаться исправить зеленый цвет, но я действительно не понимал, что это значит, так что далеко не ушел! Я также знаю, что это может быть не самый простой способ сделать это, поэтому, если у кого-то есть какие-либо другие идеи, я бы очень хотел их услышать. Я пытаюсь сделать это в MATLAB, потому что у меня уже есть скрипт для переименования файлов, и в идеале я хотел бы объединить оба в один скрипт.

Большое спасибо!

Комментарии:

1. Изображения имеют цвет RGB, поэтому сделайте свое прозрачное изображение 3-канальным, чтобы оно было белым.

Ответ №1:

Почему бы просто не добавить черные линии к исходному изображению?

 I = imread(yourfile);
expectedSize = [1500, 1500];

% Add horizontal lines of pixels (if needed)
line1 = zeros(1, size(I, 2));
Im = [repmat(line1, [(expectedSize(1) - size(I, 1))/2, 1, 3]); ... % add lines on top
    I; ...
    repmat(line1, [(expectedSize(1) - size(I, 1))/2, 1, 3])]; % add lines on the bottom

% Add vertical lines of pixels (if needed)
line2 = zeros(size(Im, 1), 1);
Im = [repmat(line2, [1, (expectedSize(2) - size(Im, 2))/2, 3]), ... % add lines to the left
    Im, ....
    repmat(line2, [1, (expectedSize(2) - size(I, 2))/2]), 3]; % add lines to the right
 

Ну, это было сделано при условии, что результат expectedSize(i) - size(I, i) делится на 2, но вы поняли идею…

Комментарии:

1. Большое спасибо, это здорово! У меня были некоторые проблемы с добавлением вертикальной линии пикселей, и, пытаясь исправить это, я в конце концов остановился на этом: code%crop image to 1470x1176 pixels (height x width) resized_img = img(16:1485,163:1338,:); % Add horizontal lines of 15 pixels top and bottom line1 = zeros(15, size(resized_img, 2), 3);%create line im = [line1; resized_img; line1]; %concatonate above and below image % Add vertical lines of 162 pixels left and right line2 = zeros(size(im, 1), 162, 3); %create line im2 = [line2, im, line2]; %concatonate left and right of im

2. Из любопытства, в чем была проблема с вертикальными линиями? Кроме того, не забудьте принять ответ, если это решение сработало для вас.

3. Размер строки 2 не был таким же, как у меня. Меня это немного смутило, потому что эта ошибка должна была произойти и для строки 1, но по какой-то причине это, казалось, происходило только на вертикальных линиях. Подумал, что это может быть, что мне тоже нужна ось z, т. Е. линия 2 = нули(размер(Im, 1), 1, 3), но это не полностью решило проблему.

4. Странно, но с моей стороны это прекрасно работает. Может быть, вы инициализировали line2 размер исходного изображения I вместо уже измененного Im ? В любом случае, рад, что вы нашли решение.