MS-SSIM图像评估算法Paddle版本复现(完善中)

前置工作

MS-SSIM需要用到SSIM,为SSIM的改进版本
python numpy版本SSIM复现与算法解释

算法公式

计算公式

算法实现

ssim使用paddle官方使用高斯滤波的版本进行修改

def _ssim(img1, img2, L = 255):
    """Calculate SSIM (structural similarity) for one channel images.
    It is called by func:`calculate_ssim`.
    Args:
        img1 (ndarray): Images with range [0, 255] with order 'HWC'.
        img2 (ndarray): Images with range [0, 255] with order 'HWC'.
    Returns:
        float: ssim result.
    """
    C1 = (0.01 * L)**2
    C2 = (0.03 * L)**2

    img1 = img1.astype(np.float64)
    img2 = img2.astype(np.float64)
    kernel = cv2.getGaussianKernel(11, 1.5)
    window = np.outer(kernel, kernel.transpose())

    mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5]
    mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]
    mu1_sq = mu1**2
    mu2_sq = mu2**2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq
    sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq
    sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2

    ssim_map = ((2 * mu1_mu2 + C1) *
                (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
                                       (sigma1_sq + sigma2_sq + C2))
    cs_map = np.divide((2*sigma12+C2), (sigma1_sq+sigma2_sq+C2))
    return ssim_map.mean(), cs_map.mean()

def mul_ssim(img1, img2):
    if len(img1.shape) > 2:
        ssim_arr = []
        cs_arr = []
        for i in range(0, img1.shape[2]):
            ssim_val, cs = _ssim(img1[:, :, i], img2[:, :, i])
            ssim_arr.append(ssim_val)
            cs_arr.append(cs)
        return np.array(ssim_arr).mean(), np.array(cs_arr).mean()
    else:
        return _ssim(img1, img2)

def _msssim(img1, img2):
    weight = [0.0448, 0.2856, 0.3001, 0.2363, 0.1333]
    level = len(weight)
    mcs_array = []
    ssim_array = []
    img1 = np.array([[img1]])
    img2 = np.array([[img2]])
    for i in range(level):
        ssim, cs = mul_ssim(img1[0][0], img2[0][0])
        mcs_array.append(cs.mean())
        ssim_array.append(ssim)
        with fluid.dygraph.guard():
            padding = (img1.shape[2]%2, img2.shape[3]%2)
            pool2d_1 = fluid.dygraph.Pool2D(pool_type='avg', pool_size=2, use_cudnn=False, pool_padding=padding)
            pool2d_2 = fluid.dygraph.Pool2D(pool_type='avg', pool_size=2, use_cudnn=False, pool_padding=padding)
            filtered_im1 = pool2d_1(to_variable(img1))
            filtered_im2 = pool2d_2(to_variable(img2))
            img1 = filtered_im1.numpy()
            img2 = filtered_im2.numpy()

    overall_mssim = np.prod(np.power(mcs_array[:level - 1], weight[:level - 1])) * (
                ssim_array[level - 1] ** weight[level - 1])
    return overall_mssim
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-Leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值