【问题标题】:Pad array with transparent pixels in MatlabMatlab中具有透明像素的填充阵列
【发布时间】:2012-02-22 22:27:54
【问题描述】:

我在 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

有人知道如何将填充从黑色更改为透明吗?

【问题讨论】:

  • 抱歉,matlab 代码的代码高亮不起作用
  • 第一个问题是jpeg没有透明通道。
  • @user1071136,我知道,但我要保存为 .png,所以我添加的任何透明像素都会被保存。

标签: matlab transparency


【解决方案1】:

透明度是通过使用 Alpha 通道实现的;您的图像由像素组成,每个像素由一个红色值、一个绿色值、一个蓝色值和一个透明度 (=Alpha) 值组成。

你可以在写文件的时候指定你的alpha通道,

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

其中ImageR x C x 3 数组,AlphaMatrixR x C 矩阵。 (RC 是图像尺寸) Image 包含 RGB 值,而 AlphaMatrix 包含 Alpha 值。

足够的解释 - 这是一个例子。你需要一个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 填充透明值。注意数组的数据类型 - 如果是 uint8uint16,所有值必须在[0..255] 范围内。如果是double,则应该在[0..1] 范围内。

这样做的一种方法是

  1. imresize之后,将container转换为doublecontainer = double(container);
  2. padarrayNaN: padarray(container, [0 floor(...)], nan, 'pre');
  3. containerNaN 的地方用 0 填充 alpha 通道,否则为 1:

    alpha = uint8(ones(size(container)));
    alpha(isnan(container)) = 0;
    
  4. container 修复为uint8 且不包含NaNs:

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

(希望有人能想出一个更漂亮的解决方案……)

【讨论】:

  • +1 用于列出所有问题 - 当使用 intdouble 参数时,图像函数的不同行为,wut?
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2012-04-30
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多