Ideas on how dt’s Mask interface could be improved

Masks are a great part of dt, especially parametric ones IMHO. I think the interface could be improved though. I use masks but find the functionality somewhat opaque and difficult to use. I see the following areas which I think could be improved -

  • parametric masks are not well integrated with drawn ones
  • there are too many buttons, it’s confusing (e.g. inverting masks)
  • the GUI does not help me work through the operations (e.g. Filmic has tabs which you can work through in sequence)
  • the interaction between parametric mask options (exclusive, inclusive etc) and the drawn masks can be confusing.

So here are my ideas on how the interface might be improved. Please comment! Perhaps one of the devs might take on something like this!

A major change proposed is that the Mask Manager would be dropped and replaced with a more comprehensive structure (the “tree structure”) and this would be within the scope of the module being masked.

The main existing controls would continue in a simplified form. The responsibility for combining masks would reside with the tree structure. The tree structure works quite like a file manager app. It’s seems a good model for what masks are about and people are familiar with such apps, so it seems a good choice.

So I’m suggesting a module being masked would look like this -

This existing part of the module is now concerned with creating either a parametric mask or a drawn one. No combination logic. The button to say parametric and drawn is not needed because you can keep creating more masks of either type in the order you wish. The invert buttons are not needed because that’s handled in the tree. Similarly the “combine masks” dropdown.

Having created the mask(s) you need for this particular module, you can move on to the tree to specify how they are to be combined together. The idea is the tree would be directly under the existing mask section of the module, i.e. an extension of the GUI area.

Fig 1 presents the idea – it’s not intended to be an actual screen design!
This module has 4 masks it can use. You just created a parametric mask based on the grey channel, “paraMask-1”. Then you drew “drawnMask-2”. A previous module has a mask so this is also available, as currently is the case, as a raster mask, “rstrMask-3”. Similarly you have previously drawn “drawnMask-4” so this is available too.

These masks can be switched on and off. The two you’ve just created are ON. The others are OFF by default.

The stick man shows whether you want the mask inverted before it gets combined with any other mask. This can be changed mask by mask.

The parametric mask is showing you used the grey channel.

You created these two masks because you’re doing a common use case whereby a parametric mask selects what you basically want, and then you draw over it to exclude other parts of the image that you don’t want in the mask. So the drawn mask has defaulted to “and” because the pixels in the resulting mask must be in the first mask AND in the second one. The principle is that each mask except the first is combined with the one above it according to how the lower one is set. So drawnMask-2 will be AND-ed (currently called “exclusive” in dt) with paraMask-1. Processing then moves down the tree to the next mask. In this case there are no more masks to process.

So each mask can be switched on or off. You can change how it is combined with the mask above using AND, OR, SUBTRACT (and maybe EXCLUSIVE OR?). You can invert it before it is combined. And as the processing order is fixed as top down, you can move a mask up or down the tree in order to achieve what you want.

“OR” is currently called “inclusive” in dt. SUBTRACT (aka Minus) is where you remove from a mask all the pixels that are present in another mask.

Hopefully the above shows how simple cases could be input. For more complicated masks, you expand the tree by adding nodes (“folders”) and arranging the basic masks (drawn and parametric ones) as necessary. A node is a mask; it’s the result of combining the masks under that node.

Fig 2 shows a tree with one node which is the result of subtracting our drawn mask from our parametric mask.

This node is then AND-ed with another parametric mask we created which uses the red channel.

The node is not inverted, as indicated. If we needed it inverting before AND-ing with paraMask-3, this would be possible via a button or dropdown etc.

Various operations would be needed to manipulate the tree, rather like a file manager. E.g.

  • cut/paste masks from one node into another
  • insert/delete node
  • shift node up or down.

So that’s the idea! Over to you…


Thanks for this proposal. Your approach sounds very good, quickly understandable and thus easy to use, even by new users from my point of view.
Sharing masks between mpdules would be a great feature. I would really appreciate something like your approach, since I also often struggle with the masking :wink: and such a logic / structured workflow would improve a lot.