Массив площадок с прозрачными пикселями в Matlab - PullRequest
2 голосов
/ 22 февраля 2012

Я написал фрагмент кода в Matlab, который изменяет размеры изображений до определенного размера (не искажая их) и применяет заполнение при необходимости.

Однако заполнение черное, и я хотел бы, чтобыбыть прозрачнымЯ не знаю, как это сделать.Вот код, который у меня есть:

% global variables
inputFolder = 'input/images/';
outputFolder = 'input/resized/';
extension = 'jpg';
x = 1000;
y = 1000;

% list all the files in the input folder
fileList = dir([inputFolder '*.' extension]); 

% loop through all the files in the input folder, resize, pad and save
for i=1:length(fileList)
    % get filename and load image
    fname = fileList(i).name;
    container = imread([inputFolder fname]);

    % calculate local variables
    containerY = size(container,1);
    containerX = size(container,2);
    containerProp = containerX / containerY;
    canvasProp = x / y;

    % determine proportions, apply padding and resize
    if containerProp < canvasProp
        container = imresize(container, [y NaN]);
        containerX = size(container,2);
        container = padarray(container, [0 floor((x - containerX)/2)], 0, 'pre');
        containerX = size(container,2);
        container = padarray(container, [0 (x - containerX)], 0, 'post');
    elseif containerProp == canvasProp
        container = imresize(container, [y x]);
    else
        container = imresize(container, [NaN x]);
        containerY = size(container,1);
        container = padarray(container, [floor((y - containerY)/2) 0], 0, 'pre');
        containerY = size(container,1);
        container = padarray(container, [(y - containerY) 0], 0, 'post');
    end

    % save resized image
    imwrite(container, [outputFolder fname]);
end

Кто-нибудь знает, как изменить отступы с черного на прозрачный?

1 Ответ

6 голосов
/ 22 февраля 2012

Прозрачность достигается за счет использования альфа-канала;Ваше изображение состоит из пикселей, каждый из которых состоит из значения красного, зеленого и синего, а также значения прозрачности (= альфа).

Вы можете указать свой альфа-канал при записи файла,

imwrite(Image, 'filename.png', 'Alpha', AlphaMatrix)

, где Image - это массив R x C x 3, а AlphaMatrix - это матрица R x C.(R и C - размеры изображения) Image содержит значения RGB, в то время как AlphaMatrix содержит значения альфа.

Достаточно объяснений - вот пример.Вам нужен файл jpg;это напишет png файл с прозрачностью градиента.То есть он будет полностью прозрачным слева и полностью непрозрачным справа.

I = imread('a.jpg');

imwrite(I, 'a.png', 'Alpha', ...
    repmat((1:size(I,2))/size(I,2), [size(I, 1) 1]));

В вашем случае вам нужно только заполнить непрозрачные части значением 1, а прозрачные значения -0. Обратите внимание на тип данных вашего массива - если это uint8 или uint16, все значения должны находиться в диапазоне [0..255].Если это double, оно должно быть в диапазоне [0..1].

Один из способов сделать это -

  1. После imresize преобразовать container в double: container = double(container);.
  2. padarray с помощьюNaN: padarray(container, [0 floor(...)], nan, 'pre');
  3. Заполнить альфа-канал 0, где container имеет NaN, в противном случае 1:

    alpha = uint8(ones(size(container)));
    alpha(isnan(container)) = 0;
    
  4. Исправитьcontainer должно быть uint8 и не содержать NaN s:

     container(isnan(container(:,:,1))) = 0;
     container = uint8(container);
    

(надеюсь, кто-нибудь может предложить более красивое решение ...)

...