需求和问题来源
由于图形图像的语义分割工作中,需要对不同类型的区域,进行标示,但又不能完全覆盖背景图像。这产生了一个新的需求:
- 产生一个带有透明度的图像;
- 将带有透明度的图像,叠加在原始图像上。
Matlab中的透明度图像
带透明背景的图像,用普通图像软件打开时,比如window自带的照片查看器,会得到一个黑色背景。 我把它叠加在背景图像上我怎样才能把这个展示出来我试过使用alpha函数alpha(image,0)
,但它将我的整个图像设置为0是否可以将单个像素的alpha设置为0这样我就可以在一个循环中运行每个像素。
我不确定这是否有用,但是当我运行imfinfo('
full-active.png')
时,我得到:
...
Transparency = 'alpha'
SimpleTransparencyData = []
...
显示带透明度的PNG图像
您可以使用imread
读入图像。但是,如果要获取alpha通道,则需要指定其他输出参数你需要这样调用它:
[im, map, alpha] = imread('full-active.png');
im
是图像本身,map
是将忽略的颜色的映射,但alpha
是图像的透明度信息,其维度与图像一致。
首先调用imshow
并记录图像的句柄,然后使用alpha
命令使用set
通道设置透明度换句话说:
[im, map, alpha] = imread('full-active.png');
f = imshow(im);
set(f, 'AlphaData', alpha);
这将使透明的图形保持完整。
叠加带透明度的PNG图像
假设你已经有一个背景图像加载到MATLAB中。
如果你想把这两者混合在一起,你需要做一些alpha消光。你用alpha通道把两者混合在一起。换言之,假设背景图像存储在img_background中,并且img_overlay是叠放在背景图片之上的图像,请执行以下操作:
alphaMask = im2double(alpha); %// To make between 0 and 1
img_composite = im2uint8(double(img_background).*(1-alphaMask) + double(img_overlay).*alphaMask);
第一步是必要的,因为加载的alpha映射与输入图像的类型相同,通常uint8我们需要将其转换为double图像,使其介于0和1之间,并且im2double非常适合这样做第二行将每个图像转换为双精度,这样我们就可以计算这个和,并使alpha掩码和两个图像之间的数据类型兼容然后我们转换回uint8然后,可以使用imshow显示最终图像。
代码案例:
% PNG透明度
imfinfo('full-active.png')
figure
imshow('full-active.png');
[png_figure, map, alpha] = imread ("full-active.png");
figure;
png_figure_handle = imshow(png_figure );
title("png figure");
size(png_figure)
set(png_figure_handle, 'AlphaData', alpha)
img_background = img_background_original(101:400, 1:300,:);
figure;
imshow(img_background )
title("background figure");
alphaMask = im2double(alpha); %// To make between 0 and 1 im2double
img_composite = im2uint8(double(img_background).*(1-alphaMask) + double(png_figure).*alphaMask);
figure;
imshow(img_composite )
title("Fusion figure");
% 基于pixelmarked图像,转变成有透明度的PNG图像