首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于三维图像体积的SSIM

用于三维图像体积的SSIM
EN

Stack Overflow用户
提问于 2018-12-26 14:43:40
回答 1查看 2.9K关注 0票数 3

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

我用的是TF的image.ssimskimagemeasure.comapre_ssim。这两种方法对2D的结果都是一样的,但是对于3D卷的结果总是有差异的。

我研究了TF-执行skimage实训的源代码。在这两种实现中,在如何考虑和处理输入映像方面,似乎存在一些根本的差异。

复制问题的代码:

代码语言:javascript
复制
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卷的深度。

有人能给我一些启发,帮助我决定进一步使用哪一个吗?为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-26 16:27:49

粗略地看一下代码,TensorFlow似乎总是为批处理中的每个图像和每个通道计算一个2D SSIM。它对跨通道的SSIM值进行平均值,并为批处理中的每个图像返回一个值。对于TF,4D阵列是多通道2D图像的集合。

相反,SciKit-Image计算所有维度上的SSIM,如果设置了multichannel,则不包括最后一个维度。因此,在4D阵列的情况下,它计算每个通道的3D SSIM,以及跨通道的平均值。

这与您对3D数组的相似结果的发现是一致的,但是对于4D数组则有不同的结果。

然而,skimage似乎使用的是一维高斯滤波器。

我不知道这是从哪里来的,SciKit-Image在n_D图像中使用_n_D高斯。然而,高斯滤波器是一个可分离的滤波器,这意味着它可以由一维滤波器的_n应用程序有效地实现。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53933528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档