【问题标题】:Make white background transparent png matlab使白色背景透明png matlab
【发布时间】:2015-06-22 00:52:20
【问题描述】:

我正在尝试删除从我创建的代码中获得的 png 图片上的白色背景。这是我得到的图片:

我想让白色背景透明,因为我有几张我想使用 imfuse 组合的图像。

我做的是这个(我的图片叫做'A1.png'):

A1=imread('A1.png');
D=zeros(size(A1));
D(A1==255) =1;
imwrite(A1,'A11.png','alpha',D);

但是我收到这样的错误 使用 writepng>parseInputs 时出错 (第 349 行) 'alpha' 的值无效。 预期输入大小为 829x600 当它实际尺寸为 829x600x3 时。

829x600x3 uint8 是 A1 的大小。我知道我需要摆脱 x3 的东西。但我不知道是在我保存图片的时候还是在我的代码中更早的时候。

你们觉得呢?

【问题讨论】:

  • 两张图片的尺寸不同。此外,两个框之间的纵横比是不同的。您无法成功地重叠这些图像以使它们完美对齐。由于不同的纵横比,调整图像大小以使其具有相同的尺寸也不起作用。你在这里是SOL……除非你自己真的有RAW图像。我怀疑您对这两个图像都使用了imshow,然后将图形保存到文件中。不要那样做。保存原始图像,然后将它们重叠。
  • 我不明白为什么它们有不同的纵横比,因为我使用相同的代码来创建它们,如果你想看看我可以发给你。如果当我在代码中使用补丁创建图像时,我指定了轴长度,那么它们将是相同的 AR 和大小吗?
  • 如果您也可以显示代码,那就太好了。图像大小不同,因此您可以根据需要叠加它们。
  • 我现在没有代码,因为我在家但我明天可以展示它,问题是我使用带有一些数据的 excel 文件,所以它不能直接运行,除非你有excel表格

标签: image matlab picturebox imread


【解决方案1】:

您只需创建少一维的D。这是代码

D = zeros( size(A(:,:,1)) );
D( all( A==255, 3 ) ) = 1; 
imwrite(A,'A11.png','alpha',D);

【讨论】:

  • 对,A1 应该是宽 x 高 x 3,因为它是全彩色的(红色、绿色和蓝色平面)。 D 只是一个平面。
  • 当然前两行可以简化为D = double(all(A==255, 3));
  • 好的,它正在工作我想我不再收到错误了,但正如你所说,D 是一个单一的飞机,我的黄色变成黑色。如何保持黄色?
  • 你知道如何重新打开颜色吗?干杯D
  • 尝试将 D 设置为 255 而不是 1
【解决方案2】:

以下 MATLAB 代码可以去除白色背景(即将数据写入具有透明背景的新图像):

% name the input and output files
im_src = 'im0.png';
im_out = 'out.png';

% read in the source image (this gives an m * n * 3 array)
RGB_in = imread( im_src );
[m, n] = size( RGB_in(:,:,1) );

% locate the pixels whose RGB values are all 255 (white points ? --to be verified)
idx1 = ones(m, n);
idx2 = ones(m, n);
idx3 = ones(m, n);
idx1( RGB_in(:,:,1) == 255 ) = 0;
idx2( RGB_in(:,:,2) == 255 ) = 0;
idx3( RGB_in(:,:,3) == 255 ) = 0;

% write to a PNG file, 'Alpha' indicates the transparent parts
trans_val = idx1 .* idx2 .* idx3;
imwrite( RGB_in, im_out, 'png', 'Alpha', trans_val );

瞧,希望对您有所帮助!

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。请阅读此how-to-answer 以提供高质量的答案。
【解决方案3】:

这就是我的做法。我有一个没有 alpha 通道的 png,这就是为什么我很难使用上面提供的代码使其透明。

我首先添加了一个 Alpha 通道,然后将其读回并使用上面的代码,从而使它变得透明。

[RGBarray,map,alpha] = imread('image1.png'); % if alpha channel is empty the next 2 lines add it

imwrite(RGBarray, 'image1_alpha.png', 'png', 'Alpha', ones(size(RGBarray,1),size(RGBarray,2)) )
[I,map,alpha] = imread('image1_alpha.png');

I2 = imcrop(I,[284.5 208.5 634 403]);
alpha = imcrop(alpha,[284.5 208.5 634 403]);

alpha( all( I2==255, 3 ) ) = 1; 
imwrite(I2,'image1_crop.png','alpha',alpha);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2021-03-28
    相关资源
    最近更新 更多