一、概念
结构相似性指数(SSIM)是一种图像相似性度量方法,旨在评估两个图像之间的质量差异。该指数由三个方面组成,包括亮度(Luminance)、对比度(Contrast)和结构(Structure),综合考虑了这些方面的信息。SSIM值范围在[-1, 1]之间,值越接近1表示两个图像越相似。SSIM的公式如下:
在计算两张图像的结构相似性指标时,会开一个局部性的视窗,一般为N×N的小区块,计算出视窗内信号的结构相似性指标,每次以像素为单位移动视窗,直到整张图像每个位置的局部结构相似性指标都计算完毕。将全部的局部结构相似性指标平均起来即为两张图像的结构相似性指标。
SSIM优点:1)多维度评价: SSIM不仅考虑了亮度的一致性,还考虑了对比度和结构的一致性,使其更符合人眼主观感知。2)对亮度、对比度和结构敏感: SSIM能够捕捉图像中细微的亮度、对比度和结构变化,对于某些应用场景更为准确。
SSIM缺点:1)不适用于所有图像: 对于某些特殊图像(如自然图像和医学图像),SSIM可能不够灵活,对图像的变化不敏感。2)灰度不变性: SSIM对于灰度变化比较敏感,对灰度差异较大的图像评价可能不够准确。3)参数选择敏感: SSIM的计算中涉及到一些参数,选择不当可能导致评价结果不准确。
二、计算中遇到的问题
我的计算背景是一张地形图和一张重力异常图,两张图的数值差异比较大,但结构相似性很高。
两张图的数值差异体现在均值,标准差等统计量差异比较大。因此在计算SSIM的时候如果不进行预处理,结果值会很低。
Gravity Image Statistics: Mean: -6.776093420251682 Standard Deviation: 27.636145432293432 Maximum Value: 98.31195 Minimum Value: -194.399 DEM Image Statistics: Mean: 3839.7825 Standard Deviation:1649.0690918 Maximum Value: 8627 Minimum Value: 195
计算过程中遇了两个问题,分别是
1)nan值问题
!!留意两幅图像本身的灰度值
为了保证两个图片大小一致,我的重力异常图是根据高程图的大小插值得到的,但没注意,插值出来的重力异常图没插完整,导致了SSIM的nan值
于是我修改了插值方法,由linear--nearest
问题解决
2)SSIM值很小
!!进行图像预处理
我所进行的预处理包括1)归一化;2)线性拉伸
def normalize(image):
# 归一化图像到 [0, 1] 范围
normalized_image = (image - image.min()) / (image.max() - image.min())
return normalized_image
def linear_stretch(image, new_min=0, new_max=1):
# 线性拉伸
stretched_image = (image - image.min()) / (image.max() - image.min()) * (new_max - new_min) + new_min
return stretched_image
# 对 image_gravity 进行归一化和线性拉伸
normalized_gravity = normalize(image_gravity)
stretched_gravity = linear_stretch(normalized_gravity)
# 对 image_dem 进行归一化和线性拉伸
normalized_dem = normalize(image_dem)
stretched_dem = linear_stretch(normalized_dem)
得到最后的结果如下:
SSIM=0.7068189489964385