【问题标题】:SSIM for 3D image volume用于 3D 图像体积的 SSIM
【发布时间】:2019-05-24 19:16:41
【问题描述】:

我正在使用 TensorFlow 解决图像超分辨率问题(2D 和 3D),并使用 SSIM 作为eval_metrics 之一。

我正在使用来自 TF 的 image.ssim 和来自 skimagemeasure.comapre_ssim。它们都给出了相同的 2D 结果,但 3D 体积的结果总是存在差异。

我查看了TF-implementationskimage-implemenation 的源代码。在两种实现中如何考虑和处理输入图像似乎存在一些根本差异。

复制问题的代码:

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 会考虑 NHWC 格式的 SSIM 图像。这对 SSIM 超过 3D 体积有好处吗?

skimage 然而,似乎正在使用一维高斯滤波器。很明显,即使这样也没有考虑 3D 体积的深度。

有人可以对这些有所了解并帮助我决定进一步使用哪一个以及为什么?

【问题讨论】:

    标签: python-2.7 tensorflow image-processing scikit-image ssim


    【解决方案1】:

    从粗略看看代码,似乎TensorFlow始终计算2D SSIM,用于批处理中的每个图像以及每个通道。它平均跨通道的SSIM值,并在批处理中返回每个图像的值。对于TF,4D阵列是具有多个通道的2D图像的集合。

    相反,Scikit-Image在所有尺寸上计算SSIM,除了设置multichannel multichannel。因此,在4D阵列的情况下,它为跨通道的每个通道和平均值计算3D SSIM。

    这与您对3D阵列的类似结果的结果一致,但是4D阵列的结果不同。


    然而,略拍,似乎是使用1D高斯滤波器。

    我不确定你从哪里得到的,scikit-image在 n em> d图像的情况下使用一个 n em> d gaussian。然而,高斯是可分离的过滤器,这意味着它可以通过1D滤波器的 n em>应用有效地实现。

    【讨论】:

    • 感谢您的回答。至于对1D过滤器的评论,在compare_ssim源代码中,我看到gaussian filter正在使用它进一步使用gaussian_filter1D。所以我猜这个1D过滤器在这里3D应用3次。 LEMME知道这是对的。 span>
    • @结束 - 结束:使用gaussian_filter,docs说是一个多维高斯滤波器。是的,查看您链接的代码,它在for axis...,所以它循环每个维度,应用1d过滤器。 span>
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2018-11-11
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多