Как автоматизировать заполнение произвольных изображений с помощью MATLAB? - PullRequest
2 голосов
/ 09 апреля 2010

Это еще один вопрос, основанный на этом ответе:

Как реализовать эффект объектива "рыбий глаз" (трансформация бочки) в MATLAB?

Общее решение должно работать для всех цветов фона и соотношений длины и ширины.

1 Ответ

5 голосов
/ 09 апреля 2010

Как это часто бывает, в 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 создает белые отступы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...