2012-02-21 2 views
2

Я написал фрагмент кода в Matlab, который изменяет размер изображения до определенного размера (без искажений) и при необходимости применяет прокладку.Матрица Pad с прозрачными пикселями в 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 

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

+0

Извините, подсветка кода для кода matlab действительно не работает –

+0

Первая проблема заключается в том, что jpeg не имеет канала прозрачности. – user1071136

+0

@ user1071136, я знаю, но я собираюсь сохранить как .png, поэтому любые прозрачные пиксели, которые я добавляю, будут сохранены. –

ответ

6

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

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

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

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

Достаточно пояснений - вот пример. Вам нужен файл jpg; это напишет файл a 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); 
    

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

+0

+1 для перечисления всех gotchas - различное поведение функций изображения при представлении аргументов 'int' и' double', * wut *? –

+0

+1 спасибо за ясный ответ! –

+0

Последнее исправление исправлено 4 (в противном случае вы получите несоответствие размеров) – user1071136

Смежные вопросы