在Mathematica 8或以上版本中创建透明图像的最快方法?

时间:2011-12-10 18:03:10

标签: performance image-processing wolfram-mathematica transparency rgba

目前我使用:

transparent // ClearAll
transparent[i_] :=
 Module[{r, g, b, a},
  {r, g, b} = ImageData /@ ColorSeparate[i, "RGB"];
  a = Unitize[3. - (r + g + b)];
  (Image /@ {r, g, b, a})~ColorCombine~"RGB"
  ]
  1. 有没有办法玩ImageData返回的形状以消除上面的ColorSeparate / ColorCombine?
  2. 您是否可以提出与上述方法一样快或更快的改进措施或完全其他方法?
  3. 注意:该功能仅使完美的白色RGB像素透明且是预期的。

    关于第一个问题的更新:

    ColorSeparate,ColorCombine可以通过使用Interleaving消除 - > False

    transparent0 // ClearAll
    transparent0[i_] :=
     Module[{r, g, b, a},
      {r, g, b} = ImageData[i, Interleaving -> False];
      a = Unitize[3. - (r + g + b)];
      Image[{r, g, b, a}, Interleaving -> False, ColorSpace -> "RGB"]
      ]
    

    但表现更差:

    transparent0[img]; //Timing
    (* ==> {0.6490372, Null} *)
    

1 个答案:

答案 0 :(得分:10)

您使用的是什么版本的Mathematica?在Mathematica 8中,您可以使用SetAlphaChannel。例如

transparent2[img_] := SetAlphaChannel[img, Binarize[ColorNegate[img], 0.]]

将所有白色像素的alpha通道设置为0,将所有其他像素设置为1.我在

上测试了它
img = Image[Graphics3D[Sphere[], Background -> White], ImageSize -> 1000]

我得到的时间是

transparent2[img]; // Timing
(* ==> {0.10067, Null} *)

与原始代码相比

transparent[img]; //Timing
(* ==> {0.202112, Null} *)