Thanks a lot for you input. I appreciate all this wonderful infrastructure 
around Images.jl

Since I am no expert in image coloring I was simply not sure whether 
everything is already there or not. 
It seems in the case of alpha blending there are some missing parts. I 
still do not get how the "Overlay" functions work without an alpha channel 
but I will try to understand it.

And yes I mean that kind of interpolation. If have implemented now a 
function 

  colorize{T<:Colorant}(x::Real,wmin::Real,wmax::Real,cmap::Vector{T})

that takes as input a real value and two window parameters that are mapped 
to a certain color. And since the Colors.jl package has only RGB colormaps 
I have additionally implemented RGBA colormaps. I am currently not sure if 
this would fit into the existing package infrastructure...

Cheers,

Tobias



Am Montag, 16. November 2015 12:39:30 UTC+1 schrieb Tim Holy:
>
> On Monday, November 16, 2015 02:25:43 AM Tobias Knopp wrote: 
> > After investigating this a little further I found that the key things I 
> > am/was missing are: 
> > - How to compose two RGBA values a and b. It turns out that this is the 
> > "over" operation given by 
> > 
> >   c = alpha*b + (1-alpha)*a 
> > 
> > if alpha is the alpha channel of b and a has alpha=1. Do I have missed 
> it 
> > or is the over operation somewhere implemented in a package? 
>
> I'm not aware of a package that implements alpha-compositing. Perhaps it 
> could 
> be added to ColorVectorSpace (which might then need a new name), or 
> perhaps 
> better it could be its own package. If you're interested in this, I'd 
> recommend starting by creating a type that makes it clear whether you're 
> working with pre-multiplied alpha or not, see 
> https://en.wikipedia.org/wiki/Alpha_compositing#Description 
>
> > - The second thing is colormaps that include an alpha channel. This 
> allows 
> > to overlay data in a very flexible way. Otherwise its not really clear 
> how 
> > to compose things 
>
> ImageCmap lets you define a colormap that includes an alpha channel, but 
> it 
> doesn't implement any special operations. 
>
> > 
> > - The third is: given a colormap, how to interpolate into it (+ window 
> > level, window brightness). 
>
> Not quite sure what you mean, are you asking if you can have a fractional 
> value that lies between two points in the colormap? If the operations you 
> want 
> to implement can be expressed in terms of + and * via the standard rules 
> of 
> interpolation, this one should be easy :-): just use Interpolations.jl to 
> create the colormap vector, e.g., 
>
>     icmap = interpolate(cmap, BSpline(Linear())) 
>
> and pass that to ImageCmap. We can easily generalize it to allow an 
> AbstractVector. 
>
> Note that currently img[i,j] for an ImageCmap returns the index, not the 
> color 
> value. I don't remember why I did it that way, but I think that's 
> something 
> that will have to change. Just need to think of the right migration 
> strategy. 
>
> Best, 
> --Tim 
>
> > 
> > Cheers, 
> > 
> > Tobias 
> > 
> > Am Donnerstag, 12. November 2015 21:54:18 UTC+1 schrieb Tim Holy: 
> > > On Thursday, November 12, 2015 12:15:46 PM Tobias Knopp wrote: 
> > > > Thanks Tim, I tried to look into the code of Overlay but it wasn't 
> to 
> > > 
> > > clear 
> > > 
> > > > to me. In particular I am missing where the RGB(A) data is combined. 
> > > 
> > > Here: 
> > > 
> > > 
> https://github.com/timholy/Images.jl/blob/cac28026250814f6ae6594dd26e92707 
> > > 6177db60/src/overlays.jl#L60-L67> 
> > > > Is it 
> > > > really as simple as adding the individual RGB values and preventing 
> > > > overflow by clamp? 
> > > 
> > > Yes. 
> > > 
> > > > Or is there some infrastructure for color mixing in Colors.jl 
> > > 
> > > There is, but it's considerably slower. See the ColorVectorSpace.jl 
> README 
> > > for 
> > > discussion. 
> > > 
> > > > I further looked for functions for gray value mapping 
> > > 
> > > (Contrast/Brightness) 
> > > 
> > > > in Colors.jl but could not find anything. This is of course not 
> > > 
> > > complicated 
> > > 
> > > > to code but I don't want to miss an existing solution. 
> > > 
> > > The whole "MapInfo" structure is a very flexible and powerful. Search 
> for 
> > > it on 
> > > this page: 
> > > http://timholy.github.io/Images.jl/function_reference.html 
> > > From my standpoint, the best feature is that it's "lazy": you specify 
> the 
> > > transformation you want, but don't execute it until you need it. For 
> > > people 
> > > like me who routinely browse 1TB images but probably look at <1% of 
> the 
> > > raw 
> > > data in any given dataset (and who also don't have 1TB worth of 
> RAM...), 
> > > this 
> > > is quite an advantage. 
> > > 
> > > In my own work, I pretty routinely design custom MapInfo types/map 
> > > functions 
> > > for visualization purposes. For example, I can color individual blobs 
> in 
> > > each 
> > > frame of a movie with something along the lines of 
> > > 
> > > immutable ColorizeBlobs 
> > > 
> > >     blobpixels::Vector   # of length nblobs 
> > >     blobcolors::Vector{RGB{U8}}  # color assigned to each blob 
> > > 
> > > end 
> > > 
> > > and passing that to ImageView using the "scalei" keyword argument (a 
> > > legacy of 
> > > the days when this was called ScaleInfo rather than MapInfo). It's a 
> nice 
> > > way 
> > > of getting custom visualization while leaving all the stupid zoom & 
> > > navigation 
> > > functionality up to ImageView. 
> > > 
> > > --Tim 
> > > 
> > > > Tobi 
> > > > 
> > > > Am Donnerstag, 12. November 2015 16:42:00 UTC+1 schrieb Tim Holy: 
> > > > > Probably the easiest thing would be to just extend the code in 
> Images 
> > > 
> > > and 
> > > 
> > > > > submit a PR (the code is not very complicated). 
> > > > > 
> > > > > However, you can do very fancy things with MapInfo objects. This 
> is 
> > > > > untested, 
> > > > > but it should be close: 
> > > > > 
> > > > > immutable TwoColormap <: MapInfo 
> > > > > 
> > > > >     colormap1 
> > > > >     colormap2 
> > > > > 
> > > > > end 
> > > > > 
> > > > > function map!(dest, mapi::TwoColormap, 
> > > > > src::Tuple{AbstractArray,AbstractArray}) 
> > > > > 
> > > > >     img1, img2 = src 
> > > > >     for I in eachindex(dest) 
> > > > >     
> > > > >         dest[I] = clamp(RGBmapi.colormap1[img1[I]] + 
> > > > > 
> > > > > mapi.colormap2[img2[I]]) 
> > > > > 
> > > > >     end 
> > > > >     dest 
> > > > > 
> > > > > end 
> > > > > 
> > > > > --Tim 
> > > > > 
> > > > > On Thursday, November 12, 2015 07:23:07 AM Tobias Knopp wrote: 
> > > > > > Hi, 
> > > > > > 
> > > > > > I am using the OverlayImage type from the Images.jl package to 
> > > 
> > > overlay 
> > > 
> > > > > two 
> > > > > 
> > > > > > different grayscale images (tomographic data). 
> > > > > > If I understand it correctly OverlayImage is restricted to 
> colormaps 
> > > > > 
> > > > > that 
> > > > > 
> > > > > > go from black to a certain RGB value. Has anybody an idea how 
> this 
> > > 
> > > could 
> > > 
> > > > > be 
> > > > > 
> > > > > > extended to Colormaps provided by Colors.jl? 
> > > > > > 
> > > > > > So my need is: 
> > > > > > Input: two 3D datasets (FloatingPoint) + two Colormaps + 
> WindowWidth 
> > > > > > WindowLevel for each 
> > > > > > Output: Combined 3D dataset as RGBA values. 
> > > > > > 
> > > > > > Thanks 
> > > > > > 
> > > > > > Tobias 
>
>

Reply via email to