Matlab中具有透明像素的焊盘阵列



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

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

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

您可以在编写文件时指定您的alpha通道,

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

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

解释够多了——这里有一个例子。您需要一个jpg文件;这会写具有梯度透明度的CCD_ 10文件。也就是说,它将是完全透明的左边是完全不透明的。

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转换为double:container = 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且不包含NaN s:

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

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

最新更新