Самый быстрый способ создать прозрачное изображение в Mathematica 8 или выше? - PullRequest
4 голосов
/ 10 декабря 2011

На данный момент я использую:

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} *)

1 Ответ

10 голосов
/ 10 декабря 2011

Какую версию Mathematica вы используете?В Mathematica 8 вы можете использовать SetAlphaChannel.Например,

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

установит для альфа-канала всех белых пикселей значение 0, а для всех остальных пикселей - 1. Я проверил это на

img = Image[Graphics3D[Sphere[], Background -> White], ImageSize -> 1000]

, и время, которое я получил, составляет

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

по сравнению с исходным кодом

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