This function assumes that img1 and img2 are image batches, i.e. the last
three dimensions are [height, width, channels].

Original paper: Wang, Zhou, Eero P. Simoncelli, and Alan C. Bovik. "Multiscale
structural similarity for image quality assessment." Signals, Systems and
Computers, 2004.

Args

img1

First image batch with only Positive Pixel Values.

img2

Second image batch with only Positive Pixel Values. Must have the
same rank as img1.

max_val

The dynamic range of the images (i.e., the difference between the
maximum the and minimum allowed values).

power_factors

Iterable of weights for each of the scales. The number of
scales used is the length of the list. Index 0 is the unscaled
resolution's weight and each increasing scale corresponds to the image
being downsampled by 2. Defaults to (0.0448, 0.2856, 0.3001, 0.2363,
0.1333), which are the values obtained in the original paper.

filter_size

Default value 11 (size of gaussian filter).

filter_sigma

Default value 1.5 (width of gaussian filter).

k1

Default value 0.01

k2

Default value 0.03 (SSIM is less sensitivity to K2 for lower values, so
it would be better if we took the values in the range of 0 < K2 < 0.4).

Returns

A tensor containing an MS-SSIM value for each image in batch. The values
are in range [0, 1]. Returns a tensor with shape:
broadcast(img1.shape[:-3], img2.shape[:-3]).