Arnold Denoiser

The Arnold Denoiser (Noice) is a stand-alone program post-process denoiser executable. It works on EXR files and outputs an EXR file with the denoised layers. It takes into account multiple frames and multiple light AOVs. It requires variance information for all AOVs and optionally uses normal, depth, and albedo. Like most denoisers, it considers a neighborhood around the current pixel and looks for similar neighborhoods inside a given search area to blend together.

Inputs

Required Input Layers

The required absolute minimum inputs are the following:

It's recommended to set Preserve Layer Name to ON in the output drivers so that the Arnold denoiser can automatically detect what each AOV corresponds to.

Optional Feature Layers

These optional layers are used to guide denoising and will greatly improve the result:

Optional Light AOVs to be Co-Denoised

Additional light AOVs can be present in the original EXR. If requested (-l light_aov_name) these will be co-denoised with the beauty layer. This main denoising effort will be spent on beauty, so in certain areas, the light AOVs might have increased noise.

Optional Additional Frames

Multiple additional frames can be specified to increase temporal stability (for example, -i render.002.exr -i render.001.exr -i render.003.exr).

Sequence Handling

Instead of specifying all the input images, it's also possible to use the following flags: -f n or --frames n to denoise image sequences. Another argument (-ef n or --extraframes n) specifies how many additional source frames before and after the current one should be used, for improved stability in animation sequences. The value must be between 0 and 2.

In this example, the Arnold denoiser will run for 10 consecutive frames starting at frame 5, taking into account two frames before and two frames after each source frame (for example, source frame number 5 will take into account frames 3, 4, 5, 6, and 7):

 noice -i mysequence.0005.exr -o denoised.0005.exr -f 10 -ef 2 

Outputs

The output file will include the denoised layers with the same names as the original layers.

Arguments

Pixel Neighborhood Patch Radius

This increases the softness of the denoising (while always preserving the features). The default is 3 (on the big side), but a low value would be maybe 0 or 1, middle 3, and high 5.

For every pixel, the Arnold denoiser will consider its neighborhood patch and look for other pixels with similar neighborhood patches. The radius of this neighborhood can be controlled with the -patchradius (or -pr) command-line argument. The default value is set to 3, which gives a 7x7 square neighborhood. The patch radius must be between 0 and 9, and cannot be larger than the search radius.

Pixel Search Radius

This is the area over which similar neighborhoods are found. The higher the better, but it will increase the cost of denoising. For every pixel noice will search a square area with a radius set with the command line argument -searchradius (-sr). The bigger this area, the bigger the denoising stability and the higher the chance that similar neighborhoods to be considered will be found. The default value is 9, which gives a 19x19 square neighborhood. Setting it to 21 (a search window of 43 x 43) will look over a pixel area equivalent to loading 5 frames. The search radius must be between 0 and 25.

Filter Strength

The Filter Strength parameter controls how aggressive the denoising will be, with higher values removing more noise in exchange for possibly more blurring. It defaults to 0.45 and can be controlled with the command line argument -filter_strength ( -k ).

Use lower values to preserve high-frequency textures and sharp detail, and higher values to more aggressively smooth noisy lighting and indirect illumination. For example:

0.2: Preserves a high level of texture and fine detail, with a small amount of residual noise.

0.45: Recommended default, providing a balance between detail preservation and noise reduction.

0.8: Applies stronger denoising for large smooth or noisy regions (such as GI, SSS, and interreflections), producing cleaner results at the expense of some fine detail.

Input Files

Input files to Noice can be specified with the command line argument -input (-i). Multiple frames can also be specified around the frame to be denoised in the following way:

-i <current_frame> -i <additional frames in order> 
-i render.0010.exr -i render.0008.exr -i render.0009.exr -i render.0011.exr -i render.0012.exr 

Light AOVs

Additional light AOVs to be co-denoised can be specified with the command line argument -aov (-l). For example:

-l back_lights -l RGBA -l key_light

Custom Feature Layers

For advanced users, the -fe flag (or --feature) specifies which AOVs will be used as features to guide denoising. A maximum of two custom feature buffers can be specified; any extras are ignored.

Output File

The output file can be specified with the command line argument -output (-o).

Threads

The number of threads used can be controlled with the command line argument -threads (-t). A value of 0 (the default) uses all available cores, while negative numbers specify how many cores to leave idle. (This option is not available on macOS.)

Ignore RGBA

The -ignore_rgba (-irgba) flag tells the Arnold denoiser to ignore the RGBA layer: it will neither denoise it nor copy it to the output file.

Notices

The -notices (-n) flag prints the copyright notices and exits.

Ass File Example

These additional AOV are optional, but the variance info for RGBA and additional AOVs to be denoised is not. The denoiser will work much better if N, Z, and Denoise Albedo are provided:

    outputs 7 1 STRING 
     "RGBA RGBA filter driver" 
     "RGB RGB variance driver RGB_variance" 
     "LPE_name RGBA filter driver" 
     "LPE_name RGB variance driver LPE_name_variance" 
     "denoise_albedo RGB filter driver albedo" 
     "N RGB defaultArnoldFilter@gaussian_filter driver" 
     "Z RGB filter driver" 

Notice that the AOVs that have the same source also have an EXR layer name specified at the end. The name of the layers is not important, but appending "variance" seems like a clearer way to handle this.

The filters should be set up like this (here we are using gaussian_filter, but it could be any other filter as long as it is matched in variance_filter.filter_weights).

    <filter_type>_filter  
   {  
    name filter  
    width <radius>  
   } 

    variance_filter  
   {  
    name variance  
    filter_weights <filter_type>  
    width <radius>  
    scalar_mode false  
   } 

Noice Examples

Denoising with all AOVs in separate EXR files

In this example, all the required AOVs are in separate EXR files.

noice
-i beauty.0005.exr
-i diffuse.0005.exr
-i diffuse_albedo_noice.0005.exr
-i N_noice.0005.exr
-i variance.0005.exr
-i Z_noice.0005.exr 
-l diffuse 
-o denoised_diffuse.0005.exr

Denoising just one AOV

This example denoises just the shadow AOV.

noice
 -i beauty_shadow_variance_v003.1001.exr 
 -l shadow 
 -o denoised.exr