用python做图像融合的定量评价_02-利用Python实现遥感图像融合指标

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 23:06   304   0

额额额,我真的没有在敷衍大家。其实这个标题图片真的很深意。你看,出结果前的一步是啥?咱要说的图像融合评价是不是很重要?没它,你的图像融合都不完整咋搞??是不是很重要?哎,我真的没有敷衍大家,咳咳~~

来看下今天用Python实现的指标都有哪些。

目录:1. 点锐度EVA(Python实现)

equation?tex=%5E%7B%5B1%5D%7D ;

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. 点锐度

公式:

equation?tex=P+%3D+%5Csum_%7Bi%3D1%7D%5E%7Bm+%5Ctimes+n%7D+%5Csum_%7Ba%3D1%7D%5E%7B8%7D%5Cleft%7C+df%2Fdx+%5Cright%7C+++%2F%5C+m+%5Ctimes+n+%5C%5C

其中,m、n为图像的长和宽,df 为灰度变化幅值,dx 为像元间的距离增量。

Python实现:

分析:

我们先看下公式,

equation?tex=%5Cleft%7C+df%2Fdx+%5Cright%7C 是什么?

梯度对不对?那该怎么实现?

其实这一点就要有图像处理方面对计算机的理解了。这个跟Python也没点P关系。为什么这么说?想想我们处理的栅格图像是啥玩意儿?数字图像,不管你的像素再高,你敢不敢放大看看?放大之后你还说他清晰?

还有,视频是怎么做出来的?

其实用一门语言的难点不在于有没有听说帧率这个东西?学过Python面向对象编程的应该会知道。飞机大战那个就是利用帧率实现动画的。它里面的素材全部都是图片,以不同的速度移动、导入、移走就这三个过程。

说这么多是为了想告诉大家,一个思想:模拟。计算机很多功能都是模拟的方式呈现的。这也体现数学中的一个思维:极限思维。求导过程是不是就是以无数细小的单位的组合。emmmmm,说了半天又回来了。还有的兄弟可能回想这个公式不能这样看,别慌,刚告诉你设而不求的思想。咱要学会学以致用哈哈哈。

所以,equation?tex=%5Cleft%7C+df%2Fdx+%5Cright%7C+ 的实现是不是直接用相邻或者差一个位置的像素相减就可以实现了。

咱多看点

equation?tex=%5Csum_%7Ba%3D1%7D%5E%7B8%7D%5Cleft%7C+df%2Fdx+%5Cright%7C+,这个是什么我就不卖关子了(因为前面没有介绍 a 是什么),这个式子的意思就是每个像素与周围八个像素的梯度之和。逐个对图像 中的每点取 8 邻域点与之相减.先求 8 个差值的加权 和)权的大小取决于距离.距离远.则权小.如 45° 和 135° 方向的差值需乘以需要乘以

equation?tex=1%2F%5Csqrt%7B2%7D 。再将所有点所得值相加

equation?tex=%5E%7B%5B1%5D%7D

再看一眼整体公式

equation?tex=P+%3D+%5Csum_%7Bi%3D1%7D%5E%7Bm+%5Ctimes+n%7D+%5Csum_%7Ba%3D1%7D%5E%7B8%7D%5Cleft%7C+df%2Fdx+%5Cright%7C+++%2F%5C+m+%5Ctimes+n+%5C%5C

就是遍历所有的像素点之后求均值。

其实,只要你理解公式,完全可以实现出来。就利用最基本的操作,这里面涉及到 加减 求均值 基本的操作。完全可以这样是实现。

说实话,我看了好多资料。只看到一个用C++实现EVA的,那个兄弟就是这样写的。就是直接写基本的公式。

这里我们换个方式。不能剽窃别人劳动成

实现:卷积去解决

equation?tex=%5Csum_%7Ba%3D1%7D%5E%7B8%7D%5Cleft%7C+df%2Fdx+%5Cright%7C++ ,然后我们再求矩阵的均值。我们用一个

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

公式:

equation?tex=H%28U%29+%3D+E%5Cleft%5B+-%5Clog%281%2Fp_%7Bi%7D%2C2%29+%5Cright%5D%3D+-%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%7Bp_%7Bi%7D%5Clog+%28p_%7Bi%7D%2C+2%29%7D+%5C%5C

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. 角二阶矩

公式:

equation?tex=ASM+%3D+%5Csum_%7Bi%3D1%7D%5E%7Bk%7D+%5Csum_%7Bj%3D1%7D%5E%7Bk%7D+%7BP%28i%2C+j%29%5E%7B2%7D%7D+%5C%5C

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

公式:

equation?tex=D_%7BSAM%7D%28X%29+%3D+cos%5E%7B-1%7D%28d%5E%7BT%7Dx+%2F+%28%5Csqrt%7Bd%5E%7BT%7Dd%7D+%5Csqrt%7Bx%5E%7BT%7Dx%7D+%29%29+%5C%5C

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.com5851a8dfa1e5a1c31453d5ae7108abda.png

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.net81fd9250c4c6086a8c521b15f6ef09a6.png

小技巧:

可以直接把上面的方法写到一个模块里面直接导入使用。

注:说声抱歉。感到歉意是因为我目前一名是在读本科的大学生,平时除了周二公休全都满课。所以,文章拖了几天,写的不完美、讲解的太少了,有不明白的可以评论或者直接联系我。

参考文献缺失希望大家见谅。我专业不是学遥感的,只学过一门遥感导论,这些文献都是平时上课间隙、晚上看的。没怎么写过论文,所以写的时候没太注意。

还有博客跟github的问题,可能有的兄弟又上不去的情况。这个是因为部分地区dns的问题,博客是借助github搭建的。这次因为时间没有同步更新,上一篇的博客域名换了,还没更换,博客首页是可以进的。

搞这些,本身也就是想玩玩看,再者想着如果不写点啥,可能我会把我学的Python给忘光了,毕竟我不是计算机专业的。专业也没有涉及。网上很多大佬博客,github什么的,需要可以多去看看。有些大佬可能不会去写博客什么的,但是会托管github。

最后,我想表达的就是 ”你熟不熟悉语言,这个关系不大。它仅仅是一个工具,没有相关知识的支撑,写代码再漂亮也是白搭。“,一起加油!

参考文献:

[1]王鸿南,钟文,汪静,等.图像清晰度评价方法研究[J].中国图象图形学报:A辑,2004(7):828-831.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP