Monday, December 7, 2015

This version bring two new cool features that will make the creation of local masks even easier:

A path selection tool that creates a closed region by connecting user-defined control points with a spline curve. It also provides an optional smooth falloff edge for feathering the selection. The path selection tool is similar to the path mask in Darktable, and most of the source code is actually derived from Darktable.This tool is particularly useful to generate smooth layer opacity masks for local editing.

A smoothing option for the brush of freehand drawing tool, with an adjustable smoothness:

Tuesday, October 27, 2015

The next PhotoFlow version 0.2.3 is out!
The source code, as well as OSX and Windows installers, are available from the github repository.
For Ubuntu users, the updated packages are available from the Highly Explosive PPA.
Updated archives for Arch Linux are also available from the github repository.

This new version includes several new features and improvements:

The list of available RAW demosaicing methods now includes the LMMSE algorithm, ported from RawTherapee. LMMSE is in many cases the optimal choice for noisy and/or high-ISO images.

Added new impulse noise reduction tool, based on the equivalent tool from RawTherapee

Added new perspective correction tool, based on the "keystone perspective correction" from Darktable.

A reset button is now available to restore the tools parameters to their default values

Sunday, October 4, 2015

The next PhotoFlow version 0.2.2 is out!
The source code, as well as OSX and Windows installers, are available from the github repository.
For Ubuntu users, an updated package will most likely be available in the next few days.

This new version includes few major improvements:

RGB histogram visualization
An RGB histogram has appeared above the layer list, on the top-left part of the application window. The histogram shows the RGB values of either the merged output or the sticky layer, depending which one is activated in the GUI.

Interactive editing of gradients shape
It is now possible to modify the shape of an horizontal or vertical gradient by means of control points that are added and modified directly in the preview area. This new feature is accessible when the editing mode of the gradient tool is activated, as shown in the screenshot below.

Saturday, September 19, 2015

The next PhotoFlow version 0.2.1 is out!
The source code is available from the github repository, while OSX and Windows installers will be provided very soon through the same link.
For Ubuntu users, an updated package will most likely be available in the next few days as well.

PhotoFlow version 0.2.1 fixes a quite large number of issues related with the new GUI layout.
However, a new release would be rather boring without new features! So there is a bunch of cool new things and improvements that have been added in this release.

Friday, August 21, 2015

The new version is currently only available as source code from the master branch on github.

Linux, Windows and OSX packages will be provided very soon.

The main update in this version is the new GUI layout that uses a single window scheme instead of putting the controls of each layer into separate modal dialogs:

In this new layout, the list of layers has been moved to the left of the preview area, while on the right a new panel appeared which groups all the opened tool controls. The controls of a given layer are added to the right panel by double-clicking on the layer's name (in the previous versions, double-clicking on the layer name opened the controls dialog, so the logic is finally quite similar).

The basic parameters of the selected layer (name, blend mode, opacity and intensity) are duplicated above the layers list for quick access, even if the the main layer controls are not opened in the right panel:

The controls widgets that appear in the right panel, and which replace the old dialogs, have a common "header" followed by tool-specific widgets (sliders, curves, selectors, etc...):

The common header includes the basic layer parameters (name, blend mode, opacity and intensity), plus a number of small buttons:

Expand/collapse the controls.

Close the controls (it does no remove/delete the corresponding layer).

Toggle the layer visibility. This button has the same effect as the corresponding check box in the layers list. Both can be used simultaneously.

Enable/disable the layer masks. When disabled, any grayscale layer mask associated to the layer is completely ignored. Useful to quickly preview the effect of a mask by toggling it on and off.

Toggle "sticky" flag on/off. When enabled, the preview area will always show the output of the corresponding layer, otherwise the composite output will be shown. Only one tool at a time will be set in "sticky" mode.

Toggle "editing" flag on/off. When enabled, mouse interactions in the preview area are allowed for the corresponding tool. Only one tool at a time will be set in "editing" mode.

The rest of the controls are basically equivalent to the ones available in the previous tools dialogs.

The "editing" flag probably deserves some additional clarifications. In PhotoFlow, several tools can be controlled via mouse interactions in the preview area. For example, control points can be added into a curves adjustment by control-clicking in the preview area, or the area selected by the crop tool can be adjusted by dragging the sides of a corresponding highlighted rectangle rendered on top of the preview image.
However, only one tool at a time can eventually interact with the preview area, otherwise it would be a complete anarchy. The "editing flag" toggle button serves exactly this purpose: it defines which tool takes exclusive control of the mouse interactions in the preview area.

This new release includes some additional changes/improvements:

updated G'MIC to the 1.6.5.2_pre version

grouped mask-related tools in a new "mask" tab

As this release involves a quite extensive modification of the GUI source code, I cannot exclude more instabilities and crashes than usual. However, I have decided to release this new version as early as possible to hopefully receive feedback and improve it even further in the next releases, which will likely come quite frequently.

Wednesday, August 5, 2015

I'm pleased to announce that a new version of PhotoFlow has just been released on GitHub. This version brings a few nice new features and includes several improvements suggested here and there...

Here are the main improvements:

EXIF data is now copied from input images to the exported TIFF and Jpeg files. The EXIF data is handled through the GEXIV2 library (the same used by GIMP), therefore GExiv2 is needed from now on to compile PhotoFlow.

The preview image is now processed by multiple threads (one for each available CPU core), I expect some significant improvement on multi-core machines

A new "HSL mask" tool has been added: it allows to create a layer mask based on Hue, Saturation and Luminance curves

The icons associated to the layer masks now reflect the actual mask status (empty, enabled, disabled)

The G'MIC code has been patched to avoid crashes under OSX. Now most of the G'MIC filters work in a stable way on OSX as well

The OSX installer is available from here, while Ubuntu packages should soon be available from Dariusz Duma PPA. A windows installer will also follow in a short time and will be available from the same link os the OSX one.

For the next version, I plan to focus on finalizing the new controls interface, that will be hopefully more user-friendly than the present dialog-based one (see here for a preview)...

Any feedback will be highly appreciated!

----------------
Here is the full changelog:

Improved selection of curve points

The curve points for the generation of the mask for the the B/C/S/H (Brightness/Contrast/Saturation/Hue) tool can now be added by ctrl-clicking on the preview area.

Added feathering of B/C/S/H mask

Added H/S/L mask tool. The generated grayscale image is equivalent to the mask of the B/C/S/H tool, however the advantage is that it can be used as a generic layer mask to be associated to other tools (like curves, blurs, etc...)

It basically collects all my knowledge about combining multiple shots into a panoramic image, and blending multiple exposures to expand the dynamic range of the camera in a natural way.

The tutorial is quite long, but it hopefully gives all details needed to reproduce the various steps.

By the way, once you are on pixls.us I suggest you to take a tour of the other awesome articles as well as the forum, where some great people discuss about Open Source tools and shooting or post-processing techniques.

-
the Brightness/Contrast/Saturation/Hue Adjustment tool, which includes
three curves that allow to modulate the effects according to the hue,
the saturation and/or the lightness of the input pixels. By default the
curves are disabled and all adjustments are applied globally. This tool
allows to do things like "boost the saturation and the contrast of dull
green colors in the mid-tones". The screenshot gives an example of an
hue adjustment that selectively turns the red colors into green, using
the curve shown in the image.

Sunday, June 21, 2015

This
is another bugfix release that corrects an issue preventing the proper rendering of "clone" layers in certain situations. The problem has been introduced by the changes in the layer visibility logic in 0.1.3.

Updated Windows and OSX installers are available from the usual downloads page.

Friday, June 19, 2015

The post describes a method to imitate the "Clarity" effect in Lightroom, by applying a UnSharp Mask (USM) filter at high radius restricted to the mid-tones of the image.

So I took this idea and tried to implement it in a flexible way in PhotoFlow. In order not to re-use the same terminology as Lightroom, the filter is called "Volume" (as it is intended to give some "volume" to your image...).

In the current version, a local contrast enhancement filter (USM for the moment) is strength-modulated with a smooth curve applied to the luminosity channel of the input pixel data. The screenshot below shows the graphical interface of the filter with the default parameter values. The five vertical sliders in the bottom allow to control the strength of the effect in various luminosity ranges. The example below corresponds to a possible selection of the mid-tones.

More specifically, the 5 sliders correspond to input values of 0% (blacks), 25% (shadows), 50% (mid-tones), 75% (highlights) and 100% (whites). For example, the default configuration show above is equivalent to this smooth tone curve:

The filter is still in an experimental form, but works already without issues and therefore it will most likely be included in the next release for user testing and feedback.

In future, a simple extension (which is already foreseen in the code and GUI) will be to add other local contrast enhancement filters, in addition to large-radius USM. Here are some possible choices:

Thursday, June 18, 2015

This is a bugfix release that brings improvements in the program stability, in particular in the handling of cloned layers. It also fixes some issues with the visualization of RAW files at zoom levels below 100%.

Here is the complete changelog:

Version 0.1.3

Fixed opacity blending of "Color" mode in RGB and Lab colorspaces

Fixed opacity blending of "Luminosity" mode in Lab colorspace

Fixed filling of layer list of clone tool: for clone layers inserted in layer masks, the parent layer was incorrectly included in the list, leading to a possible unresolvable circular dependency between the clone layer and its source. Now the parent layer is not included anymore in the list of possible clone sources.

Original "visible" flag of layers renamed to "enabled", and added a new "visible" flag to indicate if a given layer is either directly hidden or indirectly hidden because some of its parents are hidden. The "enabled" flag now indicates if the layer is directly hidden.

Removed fatal assertion on the validity of the output image from layer extra inputs. Now if the image is invalid a NULL pointer is simply added to the list of extra inputs, without causing a program crash. Nevertheless, a notification mechanism should be introduced to inform the user of the abnormal situation.

Fixed corruption of RAW image metadata at zoom levels below 100%

Fixed bug in the image preview at program startup

Fixed several clang compilation warnings

Version 0.1.2

Added "invert" parameter to gradient tool (to reverse the direction of the gradient

Fixed bug that prevented correct loading of presets with multiple layers into a layer mask

Fixed locale support (only tested with french translations under Linux)

pfconv: output file is now overwritten in place by exiftool

Updated Windows and OSX installers are available from the usual downloads page.

Thursday, June 11, 2015

So I've been recently working on a new layout of the layers list and the tools controls, with the hope to make the interface more intuitive and improve the overall usability.

This new interface puts the controls of the various filters (sliders, curves, etc...) directly in the main window, instead of using separate dialogs. The idea is to reserve an area below the layer list, where the controls of all the selected layers are shown sequentially (in the same order as the layers).

Each group of controls belonging to the same filter has a sort of "tool" bar, where one finds buttons to toggle the visibility of the layer, activate/deactivate the layer mask, activate/deactivate the preview of the current settings, and to reset all the controls to their default values. The tool bar also contains an editable field with the layer name, and an expander button that shows or hides the rest of the controls.

Here is a preview of the new interface (with two layers selected):

As you can see, there is still a lot of work to do, but the interface is I think quite clean and intuitive. Would you have any suggestion, do not hesitate to drop a comment!

A new tutorial under construction

Meanwhile I've been also busy putting together a rater long tutorial on panorama editing with Hugin and PhotoFlow. It is almost completely written now, and should soon appear on pixls.us! Keep an eye on this blog, the google+ community or directly the pixls.us forum, as we'll certainly drop a message when it will be finally online!

Thursday, May 28, 2015

Added file name widget to RAW loader dialog. This allows to edit multiple RAW files simultaneously in the same image.

Added digital watermarking tool based on G'MIC "watermark_fourier" filter (thanks +Morgan Hardwood for suggesting this). A tutorial about this new tool will soon be posted on this blog.

Modified Hue/saturation and brightess/contrast tools to work correctly also in Lab colorspace.

Fixed computation of saturation adjustment. Now the saturation slider produces exactly the same output as the equivalent tool in GIMP (except that computations are in 32-bits floating point precision and are applied non-destructively). Internally, the hue/saturation tool now works in the HSL colorspace like GIMP (instead of the HSV colorspace used before).

Basic usage of layers and layer masks

This first video basically shows:- how to open a RAW file and process the RAW data to produce an initial RGB image- how to increase the global and local contrast in the mid-tones using luminosity masks- how to crop the image with a fixed aspect ratio- how to edit a radial gradient to add some vignetting effect

That
was probably not my best edit ever, but it should give a reasonable
idea of how to perform the basic editing steps and what kind of
real-time speed one can expect from the current version of photoflow.
Concerning speed, you will notice that the loading and initial
processing of the RAW image takes quite long. That is because
full-resolution data is being cached during this time, to speed-up the
rest of the processing. I hope to make the whole thing a lot faster in
future, but I'm presently concentrating on usability and stability more
than speed optimizations.

Pseudo-HDR with PhotoFlow and Enfuse

The first video shows:- how to save the RAW processing parameters as a preset and than use the preset to batch-convert a group of RAW files to TIFF.- how to align and exposure-blend a group of bracketed images using align_image_stack+enfuse.

The
second video describes as simple de-ghosting technique, which required
less than 5 minutes of editing. Along the editing, you will see how to
draw with the freehand painting tool directly on a layer mask.

The batch-processing is for the moment only fully supported under linux.

Friday, April 3, 2015

The "clone stamp" tool has been recently redesigned and completed, and now it is fully functional.
The tool can be found in the "misc" tab of the layer chooser dialog:

The usage of the tool is pretty easy: one has first to define a source region by left-clicking on the preview area while holding down the Ctrl-Alt keys. A circle shows the size of the area being cloned.

Once the source area is selected, there will be two circles shown in the preview: one corresponds to the current mouse position, the other to the area being cloned:

The pixels are cloned by dragging the mouse while holding down the left mouse button:

The clone/stamp tool is controlled by three parameters: the size of the brush, the opacity with which the cloned pixels are overlaid with the original ones, and the smoothness of the brush edges. The image below shows the same area cloned wih a brush smoothness of 100%, 50% and 0%:

Friday, March 27, 2015

I've been silent for quite some time recently, for quite good
reasons: I've been busy working on a new multi-scale decomposition tool,
based on G'MIC "split_details" filter. Actually, porting the "split_details" filter was quite easy. The hard part has been to modify the processing engine so that it can handle multiple output images from one operation... but this is quite off-topic.

The multi-scale decomposition filter works in a similar way to the "Wavelet decompose" gimp filter: it creates a blurred base image and several separate layers containing the image details at increasing spatial frequencies. Each level has to be blended with the base image in "grain merge" mode in order to recreate the original. The various scales are obtained with classical gaussian blurs instead of wavelets, but apart from that they are equivalent to their wavelet counterparts.The filter is controlled by two parameters: the blur sizes of the smallest and largest detail scales, expressed in percent of the image dimensions. One needs to hit the "Update" button whenever one or both of the parameters is changed; this will trigger the re-computation of the various scales and will refresh the preview.

Image decomposition is typically used for skin retouching, and this post will be mostly devoted to this topic. However, I do not claim at all to be an expert of this technique.
Very briefly, the basic idea of skin retouching through multi-scale decomposition is to "erase" the unwanted elements in the layer where they are most prominent, leaving other details in higher or lower scales intact. For example, you might want to remove some visible skin defect without destroying the natural texture of the skin pores.
A very comprehensive introduction on the subject can be found on Patrick David's blog, here and here. From my side, I will limit myself at explaining how you can apply in PhotoFlow the techniques described by Patrick David.

The multi-scale decomposition filter is available in the "Details" tab of the layer chooser dialog. However, using this filter for skin retouching requires a bit of tedious "preparation work"... The good news is that I have already done all the work for you, and bundled into an handy preset that I strongly suggest to download and use as a starting point (you can get it from here).

Once loaded, the preset will create several group layers (one for each scale), with blend mode set to "grain merge". In this blend mode, the pixel values are added or subtracted depending wether they are above or below 50%; therefore, a value of exactly 50% does not modify anything.

Each group contains initially two layers, one with the details at the given scale and one filled uniformly with a 50% gray. The uniform 50% layer is associated with an opacity mask that is initially black, so that all image details are preserved by default in the final result.
In this configuration, unwanted details can be "erased" by simply drawing with a white pencil on the layer mask. The strength of the "detail suppression" can be controlled via the opacity of the 50% gray layer.

Of course, several other edits can be applied to the detail layers. Some examples are local gaussian blurs, or the healing brush to clone details from one place to another.

A practical example

Here is an example of the image decomposition in action. I've used a detail of the Mairi image, originally used in Patrick David's tutorial, for lack of a better idea and also for an easier comparison with Patrick's own result... For this example I've used a "base scale" value of 0.2% and a "detail scale" value of 0.02%, and I've worked on the scales #5, #4 and #3.
First, I've enabled the "gray" layer in the "Scale 5" group, and then I've opened the layer mask by double-clicking on the gradient icon.

Then I've double-clicked on the "gray mask" layer and I've started painting with a white
brush of 20px, to progressively replace the large-scale details by an
uniform 50% gray color.

The results of this step are shown below (click
on the caption to see the original image, the original "scale #5"
details, the final mask, the final "scale #5" details, and the resulting
image).

Finally, with two more strokes on the 3rd scale I have retouched just a
bit more the two lines above the nose. The opacity of the gray layer was
set at 50%, to show how one can produce very subtle changes through this method.

Conclusion

Of course this example if far from being a complete skin retouching tutorial, but it should be enough to give an idea of the potential of multi-scale decomposition and of how to use this technique in photoflow.

The nice thing is that the whole set of steps is non-destructive: the parameters of the scale decomposition as well as the edits of the individual scales can be tweaked at any moment with no limitations. When changing the decomposition parameters, it is necessary to click on the "Update" button in order to refresh the preview image. This will take a bit of time to complete, as the program needs to re-compute the different scales and cache the data again. Once the computation finished, all layers will be automatically updated to reflect the new settings.

Last but not least, this tool is fully integrated with the rest of the processing pipeline, and it is therefore possible to perform the skin retouching directly on a RAW image, without the need of an intermediate RAW converter.

Combining both of them, it is possible to create a filter that selectively sharpens the image portions that are already "quite sharp", and leave untouched other smooth regions (like an out-of-focus background). The main interest of doing that is to avoid sharpening the noise in smooth areas. One can usually also increase the sharpening strength, because the effect is restricted by the edges mask. Moreover, the technique is not limited to the RL de-convolution filter, since the edge mask can be applied to any kind of sharpening tool. In PhotoFlow, you can currently choose between UnSharp Mask (USM) and RL de-convolution.

Below you can see the result of the edge masking filter, compared with the original image and a classic sharpening. For comparison, I've also added the output of edge-masked USM from PhotoFlow and RawTherapee, so that you can better compare the quality of the result with other existing open-source alternatives (it seems that there is no edge-masked sharpening available in Darktable for the moment).

In this post I will not go into all details of how to create an edge-masked sharpening filter in PhotoFlow. Instead, I am providing a preset that automates the whole procedure, and I will only describe the few adjustment layers that have an impact on the output result (most of the layers in the preset are just buffers and copy operations). The screenshot below shows the preset in action, with some annotations that point to the relevant layers. The preset can be directly downloaded from here.

As you can see, the preset allows to directly visualize the edge mask being applied: for that, one has to select the "gradient norm" layer and activate the "show active layer" radio button below the preview area. Two parameters in the "Gradient norm" tool mainly control the generated mask: the "Threshold" value determines how much sharpening is applied in smooth areas, while the "Multiplier" value controls the amount of mask pixels that are purely white.

The "sharpening" layer lets you define the sharpening method (currently the standard Unsharp Maks and G'MIC "Richardson-Lucy de-convolution" are implemented) and its strength.

Finally, The "Halo control" group allows to optionally adjust the strength of the dark and light sharpening halos separately. I personally find that reducing the opacity of the light halos to 50% gives slightly better results.

The advantage of this approach is that the edge mask can be directly applied to any additional sharpening method that might be added in the future, and vice-versa new edge detection methods could be used to mask any of the existing sharpening filters.

Saturday, February 14, 2015

In this second part of the step-by-step description of my final edit of the image in this google+ post of the "Open Source Edit my RAW" discussion group, I want to introduce another simple yet powerful technique for enhancing the sky in landscape pictures.

The technique consists in blending the "b" Lab channel with the original image in "Overlay" mode. Below you can see a comparison between the original image, the result of the previous step, the result of the "b" channel blend and the "b" channel itself.

In the "b" channel, anything that contains some blue is below 50% and gets darkened in the overlay blend, while "yellowish" areas (including leaves and grass) are above 50% and result in lighter tones after blending. In order to keep the lightness of the tree and grass close to the original, I've added a slightly darkening tone curve to the Overlay blending input. The tone curve, as well as the settings for the "b" channel blend, can be seen in the screenshot below.

The nice thing with this technique and the one described in the previous post, is that the result is achieved using only the image data itself, without any masking. The effect is therefore very "natural", without any presence of disturbing halos in the transition areas.

In order to simplify the application of this steps, I've prepared a preset that automatically adds a group layer containing both the red channel blend and the "b" channel overlay. The preset can be downloaded from here.

The technique turns out to be also quite powerful for haze removal. Below I have applied the preset to the RAW image shared in this google+ post (mouse over to see original image):

the sky was too bright, and I wanted to obtain a more saturated blu tint as well as more contrast and "texture" in the clouds

the tree in the foreground is the main element of the composition, so I wanted to give it some "pop"

the scene gave me a "late afternoon" feeling, so I wanted to add some overall warm tone

The starting point is the original RAW image, processed using the in-camera settings and the standard Adobe color matrices (for a detailed tutorial on how to open and process a RAW image, see here).

Let's see my editing step-by-step, starting from the sky and clouds. Actually, the techniques described in this and the next posts are not really peculiar to PhotoFlow, and most likely can be applied with minor modifications in other image editors.

Part 1: sky editing

In oder to darken the sky and clouds, I will use a rather common but very powerfull technique, which consists in replacing the luminosity channel of the original image with its own RED channel, and then blend the result back with the original image in "Darken" mode.

The screenshots below shows how this can be achieved in PhotoFlow.

Here are the detailed steps that I've followed:

Add a group layer (I've called it "Sky edit") above the developed RAW image (new groups can be created by clicking on the "G+" button).

Add
a "clone" layer inside the group: for that, you have to select the
empty row below the group name, than click on the "+" button to open the
tool chooser dialog, and then select the "Clone layer" row in the
"Misc" tab before clicking the "OK" button to close the dialog.

In
the "clone layer" configuration dialog that will pop up, you have to
choose the layer corresponding to the initial image (in my vcase "RAW
developer") for the layer name, and the "R" channel for the source. The
image is graysacle at this point, since we only cloned one channel. To
"restore" the colors, set the blend mode to "Luminosity".

You
will notice at this point that the sky got quite darker, but the reddish
leaves in the trees became very bright. What we would like is to keep
what is darker in this R channel blend, and preserve everything else
from the original image... to achieve this, you have to change the blend
mode of the "Sky edit" group from "Normal" to "Darken"

There it is! The sky has now a deeper blue and more contrast
in the clouds, all that without any masking and unwanted halos around
the transition regions. Click on the caption elements to see the original image, the red channel, and the luminosity blend before the final "Darken" blend.

Subscribe To

PhotoFlow Resources

I am developing PhotoFlow for free, because I am interested in image editing algorithms and I believe in Open Source Software. If you find my work interesting or even useful, you might
consider hitting the "Donate" button and buy me a cup of coffee! (via PayPal)