Как это часто бывает, в MATLAB есть несколько разных способов сделать это. Я перечислю несколько примеров для заполнения RGB-изображений ...
Решение № 1: Добавьте отступ с CAT , чтобы получить квадратное изображение
Это решение принимает данный цвет padColor
и копирует его, используя функцию REPMAT , чтобы создать отступы нужного размера, формы и цвета. Затем отступы добавляются по сторонам изображения с помощью функции CAT :
[r,c,d] = size(rgbImage); %# Get the image dimensions
nPad = abs(c-r)/2; %# The padding size
padColor = [1 1 1]; %# RGB triple for pad color (white)
padColor = reshape(padColor,1,1,3); %# Reshape pad color to 1-by-1-by-3
if c > r %# Pad rows
newImage = cat(1,repmat(padColor,floor(nPad),c),... %# Top padding
rgbImage,... %# Image
repmat(padColor,ceil(nPad),c)); %# Bottom padding
elseif r > c %# Pad columns
newImage = cat(2,repmat(padColor,r,floor(nPad)),... %# Left padding
rgbImage,... %# Image
repmat(padColor,r,ceil(nPad))); %# Right padding
end
Вы можете изменить приведенное выше решение для работы с индексированными , бразильскими или бинарными изображениями , заменив две строки, определяющие padColor
, одной из следующее:
padColor = uint8(1); %# For an indexed image (index of color to use)
padColor = uint8(255); %# For a grayscale image (white)
padColor = true; %# For a binary image (white)
Решение № 2: создайте пустое квадратное изображение и вставьте исходное изображение
Это решение принимает данный цвет padColor
и копирует его, используя функцию REPMAT , чтобы создать чистое квадратное изображение этого цвета. Исходное изображение затем вставляется в это пустое изображение по центру:
[r,c,d] = size(rgbImage); %# Get the image dimensions
padColor = [1 1 1]; %# RGB triple for pad color (white)
padColor = reshape(padColor,1,1,3); %# Reshape pad color to 1-by-1-by-3
if c > r %# Pad rows
newImage = repmat(padColor,c); %# Make c-by-c-by-3 matrix of given color
rowIndex = floor((c-r)/2); %# Row index for inserting image
newImage(rowIndex+(1:r),:,:) = rgbImage; %# Insert the image
elseif r > c %# Pad columns
newImage = repmat(padColor,r); %# Make r-by-r-by-3 matrix of given color
columnIndex = floor((r-c)/2); %# Column index for inserting image
newImage(:,columnIndex+(1:c),:) = rgbImage; %# Insert the image
end
Вы можете изменить вышеуказанное решение для работы с индексированными , бразильскими или двоичными изображениями , заменив две строки, определяющие padColor
, одной из следующее:
padColor = uint8(1); %# For an indexed image (index of color to use)
padColor = uint8(255); %# For a grayscale image (white)
padColor = true; %# For a binary image (white)
Решение № 3: Используйте PADARRAY
Это решение использует функцию PADARRAY , чтобы создать отступы, чтобы сделать изображение квадратным. К сожалению, при использовании этого решения нет простого способа указать нужный цвет отступа для RGB-изображений (см. Ниже). Однако вы можете использовать аргумент 'replicate'
, чтобы PADARRAY просто копировал цвет по краям изображения, к которому добавляется отступ:
[r,c,d] = size(rgbImage); %# Get the image dimensions
nPad = abs(c-r)/2; %# The padding size
if c > r %# Pad rows
newImage = padarray(rgbImage,[floor(nPad) 0],... %# Pad top
'replicate','pre');
newImage = padarray(newImage,[ceil(nPad) 0],... %# Pad bottom
'replicate','post');
elseif r > c %# Pad columns
newImage = padarray(rgbImage,[0 floor(nPad)],... %# Pad left
'replicate','pre');
newImage = padarray(newImage,[0 ceil(nPad)],... %# Pad right
'replicate','post');
end
Это решение будет работать для индексированных , оттенков серого или двоичных изображений . Для этих трех типов изображений у вас есть возможность заменить аргумент 'replicate'
скалярным значением, которое вы хотите использовать для отступов (т.е. uint8(255)
для отступов белого в изображении в градациях серого). Для RGB изображений замена аргумента 'replicate'
на одно значение позволит вам создавать только цвета отступов, оттенки серого которых варьируются от белого до черного (т. Е. 1
создает белые отступы).