SSIM для объемного изображения 3D

Я работаю над проблемой сверхразрешения изображения (как 2D, так и 3D) с помощью TensorFlow и использую SSIM в качестве одного из eval_metrics,

я использую image.ssim от TF и measure.comapre_ssim от skimage, Оба они дают одинаковые результаты для 2D, но всегда есть различия в результатах для 3D-томов.

Я изучил исходный код для реализации TF и реализации Skimage. Кажется, есть некоторые фундаментальные различия в том, как входные изображения рассматриваются и обрабатываются в двух реализациях.

Код для репликации вопроса:

import numpy as np
import tensorflow as tf

from skimage import measure

# For 2-D case
np.random.seed(12345)
a = np.random.random([32, 32, 64])
b = np.random.random([32, 32, 64])

a_ = tf.convert_to_tensor(a)
b_ = tf.convert_to_tensor(b)

ssim_2d_tf = tf.image.ssim(a_, b_, 1.0)
ssim_2d_sk = measure.compare_ssim(a, b, multichannel=True, gaussian_weights=True, data_range=1.0, use_sample_covariance=False)

print (tf.Session().run(ssim_2d_tf), ssim_2d_sk)

# For 3-D case
np.random.seed(12345)
a = np.random.random([32, 32, 32, 64])
b = np.random.random([32, 32, 32, 64])

a_ = tf.convert_to_tensor(a)
b_ = tf.convert_to_tensor(b)

ssim_3d_tf = tf.image.ssim(a_, b_, 1.0)
ssim_3d_sk = measure.compare_ssim(a, b, multichannel=True, gaussian_weights=True, data_range=1.0, use_sample_covariance=False)

s_3d_tf = tf.Session().run(ssim_3d_tf)
print (np.mean(s_3d_tf), ssim_3d_sk)

Я должен взять среднее значение выходных данных в случае 3D, поскольку Tensorflow вычисляет SSIM по последним трем измерениям и, следовательно, приводит к 32 значениям SSIM. Это говорит о том, что TF рассматривает изображения для SSIM в формате NHWC. Это хорошо для SSIM по 3D объемам?

skimage однако, похоже, что используются 1D-фильтры Гаусса. Очевидно, что даже это не учитывает глубину в трехмерных объемах.

Может ли кто-то пролить свет на это и помочь мне решить, какой из них использовать дальше и почему?

1 ответ

Решение

Из беглого взгляда на код кажется, что TensorFlow всегда вычисляет 2D SSIM для каждого изображения в пакете и для каждого канала. Он усредняет значения SSIM по каналам и возвращает значение для каждого изображения в пакете. Для TF 4D массив - это набор 2D изображений с несколькими каналами.

Напротив, SciKit-Image вычисляет SSIM по всем измерениям, кроме последнего, если multichannel установлено. Таким образом, в случае массива 4D, он вычисляет 3D SSIM для каждого канала и усредняет по каналам.

Это согласуется с тем, что вы нашли похожие результаты для массива 3D, но разные результаты для массива 4D.


Тем не менее, Skimage, похоже, использует 1D-фильтры Гаусса.

Я не уверен, откуда вы это взяли, SciKit-Image использует n D гауссов в случае n D изображения. Тем не менее, гауссовский фильтр является сепарабельным, то есть он может быть эффективно реализован с помощью n приложений одномерного фильтра.

Другие вопросы по тегам