目前我使用: transparent // ClearAlltransparent[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" ] 有没有办法使用ImageData返回
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" ]
>有没有办法使用ImageData返回的形状来消除上面的ColorSeparate / ColorCombine?
>您是否可以提出与上述一样快或更快的改进或完全其他方法?
注意:该功能仅使完美的白色RGB像素透明且有意.
第一个问题的更新:
通过使用Interleaving-> False可以消除ColorSeparate,ColorCombine
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} *)您使用的是什么版本的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} *)