4

目前我使用:

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. 您是否可以提出与上述方法一样快或更快的改进方法或完全其他方法?

注意:该功能仅使完全白色的 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} *)
4

1 回答 1

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} *)
于 2011-12-10T19:11:32.497 回答