图像融合质量评价方法的python代码实现——MS-SSIM
图像融合质量评价方法的python代码实现——MS-SSIM
文章目录
1 前言
2 MS-SSIM介绍
2 MS-SSIM的代码
2.1 matlab代码
2.2 python代码
2.3 效果对比
3 总结
1 前言
在评估融合图像质量时,由于作者使用的是python代码进行融合,但有些评价指标只有matlab代码就十分不方便,所以将其重写为python代码,之前已经实现了
Q
A
B
/
F
Q^{AB/F}
QAB/F的python代码,详见图像融合质量评价方法的python代码实现——Qabf。
2 MS-SSIM介绍
MS-SSIM由Z. Wang,E.P. Simoncelli等人提出,是一种多尺度结构相似性方法,在结合观看条件的变化方面,它比以前的单尺度方法具有更大的灵活性。从Multiscale structural similarity for image quality assessment中的实验结果表明,在适当的参数设置下,多尺度方法的性能优于最佳的单尺度SSIM模型以及最新的图像质量指标。公式如下:
M
S
S
S
I
M
(
Z
,
K
)
??
=
??
[
l
M
(
Z
,
K
)
]
α
M
∏
i
=
1
M
[
s
i
(
Z
,
K
)
]
β
i
[
z
i
(
Z
,
K
)
]
γ
i
MSSSIM(Z,K)\;=\;\left[l_M(Z,K)\right]^{\alpha_M}\prod_{i=1}^M\left[s_i(Z,K)\right]^{\beta_i}\left[z_i(Z,K)\right]^{\gamma_i}
MSSSIM(Z,K)=[lM?(Z,K)]αM?i=1∏M?[si?(Z,K)]βi?[zi?(Z,K)]γi?
2 MS-SSIM的代码
matlab的代码可以看图像融合质量评价方法MSSIM、MS-SSIM、FS、Qmi、Qabf与VIFF(三)
python代码如下,有两部分SSIM.py与MSSSIM.py,首先是SSIM.py:
#ssim.py
import numpy as np
import scipy.signal
def ssim_index_new(img1,img2,K,win):
M,N = img1.shape
img1 = img1.astype(np.float32)
img2 = img2.astype(np.float32)
C1 = (K[0]*255)**2
C2 = (K[1]*255) ** 2
win = win/np.sum(win)
mu1 = scipy.signal.convolve2d(img1,win,mode='valid')
mu2 = scipy.signal.convolve2d(img2,win,mode='valid')
mu1_sq = np.multiply(mu1,mu1)
mu2_sq = np.multiply(mu2,mu2)
mu1_mu2 = np.multiply(mu1,mu2)
sigma1_sq = scipy.signal.convolve2d(np.multiply(img1,img1),win,mode='valid') - mu1_sq
sigma2_sq = scipy.signal.convolve2d(np.multiply(img2, img2), win, mode='valid') - mu2_sq
img12 = np.multiply(img1, img2)
sigma12 = scipy.signal.convolve2d(np.multiply(img1, img2), win, mode='valid') - mu1_mu2
if(C1 > 0 and C2>0):
ssim1 =2*sigma12 + C2
ssim_map = np.divide(np.multiply((2*mu1_mu2 + C1),(2*sigma12 + C2)),np.multiply((mu1_sq+mu2_sq+C1),(sigma1_sq+sigma2_sq+C2)))
cs_map = np.divide((2*sigma12 + C2),(sigma1_sq + sigma2_sq + C2))
else:
numerator1 = 2*mu1_mu2 + C1
numerator2 = 2*sigma12 + C2
denominator1 = mu1_sq + mu2_sq +C1
denominator2 = sigma1_sq + sigma2_sq +C2
ssim_map = np.ones(mu1.shape)
index = np.multiply(denominator1,denominator2)
#如果index是真,就赋值,是假就原值
n,m = mu1.shape
for i in range(n):
for j in range(m):
if(index[i][j] > 0):
ssim_map[i][j] = numerator1[i][j]*numerator2[i][j]/denominator1[i][j]*denominator2[i][j]
else:
ssim_map[i][j] = ssim_map[i][j]
for i in range(n):
for j in range(m):
if((denominator1[i][j] != 0)and(denominator2[i][j] == 0)):
ssim_map[i][j] = numerator1[i][j]/denominator1[i][j]
else:
ssim_map[i][j] = ssim_map[i][j]
cs_map = np.ones(mu1.shape)
for i in range(n):
for j in range(m):
if(denominator2[i][j] > 0):
cs_map[i][j] = numerator2[i][j]/denominator2[i][j]
else:
cs_map[i][j] = cs_map[i][j]
mssim = np.mean(ssim_map)
mcs = np.mean(cs_map)
return mssim,mcs
然后是MSSSIM.py:
#msssim.py
import numpy as np
import cv2
from index.SSIM import ssim_index_new
def msssim(img1,img2):
K = [0.01,0.03]
win = np.multiply(cv2.getGaussianKernel(11, 1.5), (cv2.getGaussianKernel(11, 1.5)).T) # H.shape == (r, c)
level = 5
weight = [0.0448,0.2856,0.3001,0.2363,0.1333]
method = 'product'
M,N = img1.shape
H,W = win.shape
downsample_filter = np.ones((2,2))/4
img1 = img1.astype(np.float32)
img2 = img2.astype(np.float32)
mssim_array = []
mcs_array = []
for i in range(0,level):
mssim,mcs = ssim_index_new(img1,img2,K,win)
mssim_array.append(mssim)
mcs_array.append(mcs)
filtered_im1 = cv2.filter2D(img1,-1,downsample_filter,anchor = (0,0),borderType=cv2.BORDER_REFLECT)
filtered_im2 = cv2.filter2D(img2,-1,downsample_filter,anchor = (0,0),borderType=cv2.BORDER_REFLECT)
img1 = filtered_im1[::2,::2]
img2 = filtered_im2[::2,::2]
print(np.power(mcs_array[:level-1],weight[:level-1]))
print(mssim_array[level-1]**weight[level-1])
overall_mssim = np.prod(np.power(mcs_array[:level-1],weight[:level-1]))*(mssim_array[level-1]**weight[level-1])
return overall_mssim
将MRI图像与融合后的图像进行评估,如下:
matlab代码运行结果如下:
python代码运行结果如下:
可以看到两种代码运行结果是一致的。
3 总结
这个代码还有一个问题在于不能处理24位的图像,不过目前正在进行FMI的matlab代码改python代码,如果完成会继续分享…
图像融合质量评价方法的python代码实现——MS-SSIM相关教程
java 使用opencv进行图像匹配 截屏+匹配
java 使用opencv进行图像匹配 截屏+匹配 本文使用opencv 进行图像匹配,通过截屏获取图像来源,与预设图片进行匹配。工具为eclipse。 opencv的安装百度即可,不过一点需要注意的是 Native library location要编辑: Select External Folder... and browse to
Native地图与Web融合技术的应用与实践
Native地图与Web融合技术的应用与实践 有用户反馈美团打车地图的性能有一些问题,美团打车技术团队在调研分析之后,采用了一套Native地图与Web的融合框架,不仅实现了用户手势事件智能分发的机制,还解决了WebView与Native地图在同一页面内布局困难的问题,同
预备AI工程师升级必备:大厂常见图像分类面试题
预备AI工程师升级必备:大厂常见图像分类面试题 图像分类是深度学习计算机视觉技术中极其重要的应用场景和技术基础,图像检测、语义分割等等各种任务场景都需要基于图像分类的基础能力。也是大家入门深度学习CV方向任务开发极好的切入点。 针对如此关键的图像
23、HTML图像按钮
23、HTML图像按钮 可以使用图像来替代按钮中的文本,从而使页面变得更加美观。 在 HTML 中,把 input 标签的 type 属性设置为 image 可以表示图像按钮。具体语法格式如下: input type=image src=url / 我们还可以把图像按钮分为图像、按钮两部分来看,因为它
程序调试与opencv图像库
程序调试与opencv图像库 目录 在Ubuntu系统上进行程序代码的GDB调试 在Ubuntu16/18系统下编译、安装著名的C/C++图像处理开源软件库 Opencv3.x Ubuntu系统下载安装OpenCV-3.4.10 用opencv打开一张图片 使用opencv打开摄像头 在Ubuntu系统上进行程序代码的GDB调
第七周作业 嵌入式程序调试与opencv图像库
第七周作业 嵌入式程序调试与opencv图像库 嵌入式程序调试与opencv图像库 一 在Ubuntu系统上练习程序代码的GDB调试 二 opencv安装 三 opencv的练习 一 在Ubuntu系统上练习程序代码的GDB调试 下面的代码实现对一个整型数的反转功能,比如输入123,则 输出321。
在Ubuntu16/18系统下练习编译、安装著名的C/C++图像处理开源软件
在Ubuntu16/18系统下练习编译、安装著名的C/C++图像处理开源软件库 Opencv 目录 一、安装opencv3.4.10 1.将opencv3.4.10压缩包放到home下 2.安装依赖库cmake 3.安装完cmake之后执行命令 ,创建编译文件夹 4.开始配置 5.开始编译 配置OpenCV编译环境 二、图像预
【LeetCode练习】[简单]733. 图像渲染
【LeetCode练习】[简单]733. 图像渲染 【LeetCode练习】[简单]733. 图像渲染 733. 图像渲染 题目来源 算法思想:二维数组 题目: 思路:本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是:直接或间接相邻的同色方格构成的整体。 cl