额额额,我真的没有在敷衍大家。其实这个标题图片真的很深意。你看,出结果前的一步是啥?咱要说的图像融合评价是不是很重要?没它,你的图像融合都不完整咋搞??是不是很重要?哎,我真的没有敷衍大家,咳咳~~
来看下今天用Python实现的指标都有哪些。
目录:1. 点锐度EVA(Python实现)
;
2. 信息熵Entropy(Python实现);
3. 角二阶矩ASM(Python实现);
4. 光谱角测度SAM(Python实现);
5. 结构相似度SSIM(Python实现);
6. 峰值信噪比PSNR(Python实现);
7. 其他的指标Python实现。
无参考的有EVA、ASM、Entropy;有参考的SAM、SSIM、PSNR。
不说废话了,你想知道的去下面找/xyx 。找不到的就找不到了额额额 。
我们的目的时用Python实现之后去用。所以,分析过程我们就以点锐度为例,其他都类似。其他的只写出实现。最后说点怎么写完重复利用。就想小工具那样。
1. 点锐度
公式:

其中,m、n为图像的长和宽,df 为灰度变化幅值,dx 为像元间的距离增量。
Python实现:
分析:
我们先看下公式,
是什么?
梯度对不对?那该怎么实现?
其实这一点就要有图像处理方面对计算机的理解了。这个跟Python也没点P关系。为什么这么说?想想我们处理的栅格图像是啥玩意儿?数字图像,不管你的像素再高,你敢不敢放大看看?放大之后你还说他清晰?
还有,视频是怎么做出来的?
其实用一门语言的难点不在于有没有听说帧率这个东西?学过Python面向对象编程的应该会知道。飞机大战那个就是利用帧率实现动画的。它里面的素材全部都是图片,以不同的速度移动、导入、移走就这三个过程。
说这么多是为了想告诉大家,一个思想:模拟。计算机很多功能都是模拟的方式呈现的。这也体现数学中的一个思维:极限思维。求导过程是不是就是以无数细小的单位的组合。emmmmm,说了半天又回来了。还有的兄弟可能回想这个公式不能这样看,别慌,刚告诉你设而不求的思想。咱要学会学以致用哈哈哈。
所以,
的实现是不是直接用相邻或者差一个位置的像素相减就可以实现了。
咱多看点
,这个是什么我就不卖关子了(因为前面没有介绍 a 是什么),这个式子的意思就是每个像素与周围八个像素的梯度之和。逐个对图像 中的每点取 8 邻域点与之相减.先求 8 个差值的加权 和)权的大小取决于距离.距离远.则权小.如 45° 和 135° 方向的差值需乘以需要乘以
。再将所有点所得值相加
。
再看一眼整体公式

就是遍历所有的像素点之后求均值。
其实,只要你理解公式,完全可以实现出来。就利用最基本的操作,这里面涉及到 加减 求均值 基本的操作。完全可以这样是实现。
说实话,我看了好多资料。只看到一个用C++实现EVA的,那个兄弟就是这样写的。就是直接写基本的公式。
这里我们换个方式。不能剽窃别人劳动成
实现:卷积去解决
,然后我们再求矩阵的均值。我们用一个
xiejiao = 1 / 2 ** 0.5
sizhou = 1.0
kernel = np.array([[xiejiao, sizhou, xiejiao],
[sizhou, -8, sizhou],
[xiejiao, sizhou, xiejiao]])
dst_matrix = cv2.filter2D(src_matrix, -1, kernel)
其中,scr_matrix 为原图像利用 opnecv 打开后的矩阵。(打开图像的方式很多,opencv、gdal、skimage、还有个计算机视觉的库叫啥来着)
2. 最后我们再利用
EVA_index = np.mean(dst_matrix)
求出点锐度。
2. 信息熵Entropy
公式:

Python实现:
def entropy(img):
out = 0
count = np.shape(img)[0]*np.shape(img)[1]
p = np.bincount(np.array(img).flatten())
for i in range(0, len(p)):
if p[i]!=0:
out-=p[i]*math.log(p[i]/count,2)/count
return out
当然方法不止这一种,你可以用现成的。像skimage.measure里面有现成的。
3. 角二阶矩
公式:

Python实现:
这里直接调用skimage方法,当然还有其他(不排除其他方法更好的可能),就我知道的ENVI就可以计算glcm相关的,Python调用google earth engine包也不是不可以。等等方法很多计算灰度共生矩阵;
# 计算距离为1,2和角度为0度,90度的GLCM的ASM
def asm(img, distances, angles):
# 计算GLCM
g = skimage.feature.greycomatrix(src_matrix, [1,2],[0,np.pi/2])
# 计算该glcm的ASM
asm = skimage.feature.greycoprops(g, 'ASM')
return asm
4. 光谱角测度SAM
公式:

Python实现:
def sam(src, dst):
# src, dst均为numpy数组
val = np.dot(src.T, dst)/(np.linalg.norm(src)*np.linalg.norm(dst))
sam = np.arccos(val)
return sam
5. 结构相似度SSIM
公式:
见PSNR和SSIM - 文森vincent - 博客园www.cnblogs.com
Python实现:
def ssim(src, dst):
# 数据准备
# 均值mean
mean_src = np.mean(src)
mean_dst = np.mean(dst)
# 方差var
var_src = np.var(src)
var_dst = np.var(dst)
cov = np.cov(src, dst)
# 标准差std
std_src = np.std(src)
std_dst = np.std(dst)
# 常数c1,c2,c3
K1 = 0.01
K2 = 0.03
L = 255
c1 = (K1*L)**2
c2 = (K2*L)**2
c3 = c2 / 2
# 计算ssim
l = (2*mean_src*mean_dst + c1)/(mean_src**2 + mean_dst**2 + c1)
c = (2*var_src*var_dst + c2)/(var_src**2 + var_dst**2 + c2)
s = (cov + c3)/(var_src*var_dst + c3)
ssim = l * c * s
return ssim
当然你可以像灰度共生矩阵那样直接调用skimage库来计算ssim,一行代码即可解决
ssim = skimage.measure.compare_ssim(src, dst, data_range=255)
6. 峰值信噪比PSNR(Python实现)
公式:
见 5.结构相似度
Python实现:
def mse(src, dst):
return np.mean((src.astype(np.float64)-dst.astype(np.float64))**2)
def psnr(src, dst, Max= None):
if MAX is None:
MAX = np.iinfo(GT.dtype).max
mse_value = mse(src, dst)
if mse_value == 0.:
return np.inf
return 10 * np.log10(MAX**2 /mse_value)
直接调用skimage
psnr = skimage.measure.compare_psnr(src, dst, data_range=255)
7. 其他的指标:其他的指标还有skimage.measure中除了有SSIM、PSNR、Entropy、MSE、NRMSE
平均梯度AG、空间频率SF、标准差STD、互信息MI、标准化NMI,可以参考网友文章图像融合质量评价方法AG、SF、STD、MI与NMI(二)_Python_weixin_37143678的博客-CSDN博客blog.csdn.net
小技巧:
可以直接把上面的方法写到一个模块里面直接导入使用。
注:说声抱歉。感到歉意是因为我目前一名是在读本科的大学生,平时除了周二公休全都满课。所以,文章拖了几天,写的不完美、讲解的太少了,有不明白的可以评论或者直接联系我。
参考文献缺失希望大家见谅。我专业不是学遥感的,只学过一门遥感导论,这些文献都是平时上课间隙、晚上看的。没怎么写过论文,所以写的时候没太注意。
还有博客跟github的问题,可能有的兄弟又上不去的情况。这个是因为部分地区dns的问题,博客是借助github搭建的。这次因为时间没有同步更新,上一篇的博客域名换了,还没更换,博客首页是可以进的。
搞这些,本身也就是想玩玩看,再者想着如果不写点啥,可能我会把我学的Python给忘光了,毕竟我不是计算机专业的。专业也没有涉及。网上很多大佬博客,github什么的,需要可以多去看看。有些大佬可能不会去写博客什么的,但是会托管github。
最后,我想表达的就是 ”你熟不熟悉语言,这个关系不大。它仅仅是一个工具,没有相关知识的支撑,写代码再漂亮也是白搭。“,一起加油!
参考文献:
[1]王鸿南,钟文,汪静,等.图像清晰度评价方法研究[J].中国图象图形学报:A辑,2004(7):828-831.