End*_*End 3 image-processing python-2.7 ssim scikit-image tensorflow
我正在使用 TensorFlow 处理图像超分辨率问题(2D 和 3D),并且正在使用 SSIM 作为eval_metrics
.
我正在使用image.ssim
来自 TF 和measure.comapre_ssim
来自skimage
. 它们都为 2D 提供了相同的结果,但 3D 体积的结果总是有所不同。
我已经查看了TF-implementation和skimage-implementation的源代码。在两种实现中如何考虑和处理输入图像似乎存在一些根本差异。
复制问题的代码:
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)
Run Code Online (Sandbox Code Playgroud)
在 3D 的情况下,我必须取输出的平均值,因为 Tensorflow 在最后三个维度上计算 SSIM,因此产生32 个 SSIM值。这表明 TF 考虑 NHWC 格式的 SSIM 图像。这对 3D 卷上的 SSIM 有好处吗?
skimage
然而,似乎正在使用一维高斯滤波器。很明显,即使这也没有考虑 3D 体积的深度。
有人可以对这些有所了解并帮助我决定进一步使用哪一个以及为什么?
粗略看一下代码,TensorFlow 似乎总是为批处理中的每个图像和每个通道计算一个 2D SSIM。它对跨通道的 SSIM 值求平均值,并为批次中的每个图像返回一个值。对于 TF,4D 阵列是具有多个通道的 2D 图像的集合。
相比之下,SciKit-Image 在所有维度上计算 SSIM,除了最后一个 ifmultichannel
设置。因此,在 4D 阵列的情况下,它为每个通道计算 3D SSIM 并计算跨通道的平均值。
这与您发现 3D 阵列的类似结果一致,但 4D 阵列的结果不同。
然而,skimage 似乎使用一维高斯滤波器。
我不确定你从哪里得到的,SciKit-Image在n D 图像的情况下使用n D 高斯。然而,高斯是一个可分离的滤波器,这意味着它可以通过一维滤波器的n 个应用来有效地实现。
归档时间: |
|
查看次数: |
1872 次 |
最近记录: |