高光谱图像重构常用评价指标及其Python实现

高光谱图像重构评价指标及其Python实现

高光谱图像重构的评价指标通常有三项。其中部分指标从普通图像变化而来,部分指标只有高光谱图像独有。本文拟从以下两个角度介绍高光谱图像评价指标,并列出基于Python语言的skimage库的对应实现方法。

1)从普通图像重构评价指标到高光谱图像重构评价指标

2)从普通图像重构评价指标代码到高光谱图像重构评价指标代码

一、MSE

MSE计算两组数据的均方误差,是最常用的评价相似度的准则,包括但不限于图像、信号。

Skimage库中对应的函数原型:

skimage.measure.compare_mse(im1, im2)


Parameters:


im1, im2 : ndarray

Image. Any dimensionality.


Returns:


mse : float

The mean-squared error (MSE) metric.

想要测度其他距离,参考compare_nrmse函数

http://scikit-image.org/docs/stable/api/skimage.measure.html#compare-nrmse

二、PSNR与MPSNR

1. PSNR

PSNR全称是Compute the peak signal to noise ratio。用于计算原始图像与重构图像之间的峰值信噪比。在图像超分辨率等任务中尤为常用,如同错误率之于分类任务,PSNR是图像重构任务事实上的基准评价准则。

skimage.measure.compare_psnr(im_true, im_test, data_range=None, dynamic_range =None )


Parameters:


im_true : ndarray

Ground-truth image.

im_test : ndarray

Test image.

data_range : int

The data range of the input image (distance between minimum and maximum possible values). By default, this is estimated from the image data-type.


Returns:


psnr : float

The PSNR metric.

2. MPSNR

MPSNR用于计算两幅高光谱图像之间的平均峰值信噪比。MPSNR计算方法很简单,只需要分别计算不同波段的PSNR,取均值就可以了。

 1 def mpsnr(x_true, x_pred):
 2     """
 3
 4     :param x_true: 高光谱图像:格式:(H, W, C)
 5     :param x_pred: 高光谱图像:格式:(H, W, C)
 6     :return: 计算原始高光谱数据与重构高光谱数据的均方误差
 7     References
 8     ----------
 9     .. [1] https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
10     """
11     n_bands = x_true.shape[2]
12     p = [compare_psnr(x_true[:, :, k], x_pred[:, :, k], dynamic_range=np.max(x_true[:, :, k])) for k in range(n_bands)]
13     return np.mean(p)

三、SSIM与MSSIM

1. SSIM用于计算两幅图像之间的平均结构相似度。

skimage.measure.compare_ssim(X, Y, win_size=None, gradient=False, data_range=None, multichannel=False, gaussian_weights=False, full=False, dynamic_range=None, **kwargs)


Parameters:


X, Y : ndarray

Image. Any dimensionality.

win_size : int or None

The side-length of the sliding window used in comparison. Must be an odd value. If gaussian_weights is True, this is ignored and the window size will depend on sigma.

gradient : bool, optional

If True, also return the gradient.

data_range : int, optional

The data range of the input image (distance between minimum and maximum possible values). By default, this is estimated from the image data-type.

multichannel : bool, optional

If True, treat the last dimension of the array as channels. Similarity calculations are done independently for each channel then averaged.

gaussian_weights : bool, optional

If True, each patch has its mean and variance spatially weighted by a normalized Gaussian kernel of width sigma=1.5.

full : bool, optional

If True, return the full structural similarity image instead of the mean value.


Returns:


mssim : float

The mean structural similarity over the image.

grad : ndarray

The gradient of the structural similarity index between X and Y [R327]. This is only returned if gradient is set to True.

S : ndarray

The full SSIM image. This is only returned if full is set to True.


Other Parameters:


use_sample_covariance : bool

if True, normalize covariances by N-1 rather than, N where N is the number of pixels within the sliding window.

K1 : float

algorithm parameter, K1 (small constant, see [R326])

K2 : float

algorithm parameter, K2 (small constant, see [R326])

sigma : float

sigma for the Gaussian when gaussian_weights is True.

2. MSSIM

MSSIM用于计算两幅高光谱图像之间的平均结构相似度。MSSIM计算方法很简单,只需要分别计算不同波段的SSIM指数,取均值就可以了。

1 def mssim(x_true,x_pred):
2     """
3         :param x_true: 高光谱图像:格式:(H, W, C)
4         :param x_pred: 高光谱图像:格式:(H, W, C)
5         :return: 计算原始高光谱数据与重构高光谱数据的结构相似度
6     """
7     SSIM = compare_ssim(X=x_true, Y=x_pred, multichannel=True)
8     return SSIM

四、SAM

SAM这个概念只存在于多/高光谱图像,普通图像没有这个概念。SAM又称光谱角相似度,用于度量原始高光谱数据与重构高光谱数据之间的光谱相似度。

 1 def sam(x_true, x_pred):
 2     """
 3     :param x_true: 高光谱图像:格式:(H, W, C)
 4     :param x_pred: 高光谱图像:格式:(H, W, C)
 5     :return: 计算原始高光谱数据与重构高光谱数据的光谱角相似度
 6     """
 7     assert x_true.ndim ==3 and x_true.shape == x_pred.shape
 8     sam_rad = np.zeros(x_pred.shape[0, 1])
 9     for x in range(x_true.shape[0]):
10         for y in range(x_true.shape[1]):
11             tmp_pred = x_pred[x, y].ravel()
12             tmp_true = x_true[x, y].ravel()
13             sam_rad[x, y] = np.arccos(tmp_pred / (norm(tmp_pred) * tmp_true / norm(tmp_true)))
14     sam_deg = sam_rad.mean() * 180 / np.pi
15     return sam_deg

五、相关资料

0. 文中用到的代码

https://github.com/JiJingYu/tensorflow-exercise/tree/master/HSI_evaluate

1. 文中提到的函数的文档

http://scikit-image.org/docs/stable/api/skimage.measure.html#compare-mse

2. PSNR维基百科链接

https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio

3. SSIM参考文献

[R326] Wang, Z., Bovik, A. C., Sheikh, H. R., & Simoncelli, E. P. (2004). Image quality assessment: From error visibility to structural similarity. IEEE Transactions on Image Processing, 13, 600-612. https://ece.uwaterloo.ca/~z70wang/publications/ssim.pdf , DOI:10.1.1.11.2477

[R327] Avanaki, A. N. (2009). Exact global histogram specification optimized for structural similarity. Optical Review, 16, 613-621. http://arxiv.org/abs/0901.0065 , DOI:10.1007/s10043-009-0119-z

时间: 2024-10-12 20:02:00

高光谱图像重构常用评价指标及其Python实现的相关文章

视频图像去模糊常用处理方法

视频图像去模糊常用处理方法 随着“平安城市”的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的限制,案情发生后的图像回放都存在图像不清晰,数据不完整的问题,无法为案件的及时侦破提供有效线索.经常出现嫌疑人面部特征不清晰,难以辨认,嫌疑车辆车牌模糊无法辨认等问题.这给公安部门破案.法院的取证都带来了极大的麻烦.随着平安城市的推广.各地各类监控系统建设的进一步推进,此类问题会越来越突出. 一.模糊

Python自学之旅 #新手#MacBook #《“笨办法”学Python》#第六章:常用的简易Python命令、符号、代码、格式化字符串

第六章:常用的简易Python命令.符号.代码.字符串 <“笨办法”学Python>这本书中,确实用了较多篇幅来介绍Python的一些常用简单的命令.符号.代码和字符串等,对于像我这样的自学新手,真的是非常棒,因为它们可以帮我建立接着学下去的信心和兴趣.但我在这个系列的博客当中,不打算写的这么精细,首先因为这不符合我写博的初衷和习惯,其次因为我不打算靠这写书来挣钱,最后因为我确实没有那个实力去挖掘简单东西中更深奥复杂的应用.所以,我写的这个博客,只适合像我这样的自学新手,如果想要成为大神,还是

(转载) 图像领域常用资源

跟OpenCV相关的: http://opencv.org/ 2012年7月4日随着opencv2.4.2版本的发布,opencv更改了其最新的官方网站地址. http://www.opencvchina.com/ 好像12年才有这个论坛的,比较新.里面有针对<learning opencv>这本书的视频讲解,不过视频教学还没出完,正在更新中.对刚入门学习opencv的人来说很不错. http://www.opencv.org.cn/forum/ opencv中文论坛,对于初次接触opencv

矩阵或多维数组两种常用实现方法 - python

在python中,实现多维数组或矩阵,有两种常用方法: 内置列表方法和numpy 科学计算包方法. 下面以创建10*10矩阵或多维数组为例,并初始化为0,程序如下: # Method 1: list arr1 = [[0]*10 for i in range(10)] arr1[0][0] = 1 print "Method 1:\n", arr1 arr2 = [[0 for i in range(10)] for i in range(10)] arr2[0][0] = 1 pri

Spark中RDD的常用操作(Python)

弹性分布式数据集(RDD) Spark是以RDD概念为中心运行的.RDD是一个容错的.可以被并行操作的元素集合.创建一个RDD有两个方法:在你的驱动程序中并行化一个已经存在的集合:从外部存储系统中引用一个数据集.RDD的一大特性是分布式存储,分布式存储在最大的好处是可以让数据在不同工作节点并行存储,以便在需要数据时并行运算.弹性指其在节点存储时,既可以使用内存,也可已使用外存,为使用者进行大数据处理提供方便.除此之外,RDD的另一大特性是延迟计算,即一个完整的RDD运行任务被分为两部分:Tran

MYSQL常用操作及python操作MYSQL常用类

Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 show databases 切换数据库 use databas 123123 ###用户授权 创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename user '用户名'@'IP地址'; to '新用户名'

几种常用算法的Python实现

呵呵!今天兴致高,用python重写了部分排序算法,也为笔试做下准备,继续加油 // 冒泡排序 def bubble(x,n):    '''This function orders the original items x x is list,n is the length of x'''    for i in range(n):        for j in range(n-1):            if x[j] >x[j+1]:                t = x[j]  

记一些常用到的python中的函数

1. zip()函数 它的作用是从参数中按顺序一一抽出子参数组出一个新的tuple.  直接看例子: >>> mean = np.array([2, 5, 4]) >>> out = zip('RGB', mean, 'ABC') >>> out [('R', 2, 'A'), ('G', 5, 'B'), ('B', 4, 'C')] 注意:当输入的参数的长度不同时, zip()函数会截取最短长度作为输出长度: 另外:在参数上加 * 时,表示它的逆操

MPChart图像表格常用设置配置

/** * @description:初始化表格 * @author samy * @date 2014年9月9日 下午6:27:55 */ private void initChart() { mChart.setOnChartValueSelectedListener(this);// 设置一个选择监听器将生成的图表或没有选择回调时的值. 回调包含所选值及其指数. mChart.setUnit(" ¥"); mChart.setDrawUnitsInChart(true);// 设