python设计PSNR和SSIM计算函数

PSNR

import numpy as np
import math

def PSNR(x, y):
    MSE = np.mean((x/255. - y/255.)**2)
    if MSE<1.0e-10:
        return 100
    MAX = 1
    return 20*math.log10(MAX/math.sqrt(MSE))

SSIM

import numpy as np
from PIL import Image
from scipy.signal import convolve2d

def gauss2D(shape=(3, 3), sigma=0.5):

    m, n = [(ss - 1.) / 2. for ss in shape]
    y, x = np.ogrid[-m:m + 1, -n:n + 1]
    h = np.exp(-(x * x + y * y) / (2. * sigma * sigma))
    h[h < np.finfo(h.dtype).eps * h.max()] = 0
    h_sum = h.sum()
    if h_sum != 0:
        h /= h_sum
    return h

def filter2(x, kernel, mode='same'):
    return convolve2d(x, np.rot90(kernel, 2), mode=mode)

def compute_ssim(image1, image2, k1=0.01, k2=0.03, win_size=11, L=255):

    if not image1.shape == image2.shape:
        raise ValueError("输入的两张图片大小应该一样")
    if len(image1.shape) > 2:
        raise ValueError("输入的图片应为灰度图")

    M, N = image1.shape
    C1 = (k1 * L) ** 2
    C2 = (k2 * L) ** 2
    window = gauss2D(shape=(win_size, win_size), sigma=1.5)
    window = window / np.sum(np.sum(window))

    if image1.dtype == np.uint8:
        image1 = np.double(image1)
    if image2.dtype == np.uint8:
        image2 = np.double(image2)

    mu1 = filter2(image1, window, 'valid')
    mu2 = filter2(image2, window, 'valid')
    mu1_sq = mu1 * mu1
    mu2_sq = mu2 * mu2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = filter2(image1 * image1, window, 'valid') - mu1_sq
    sigma2_sq = filter2(image2 * image2, window, 'valid') - mu2_sq
    sigmal2 = filter2(image1 * image2, window, 'valid') - mu1_mu2

    ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigmal2 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))

    return np.mean(np.mean(ssim_map))

其他

仅做学习记录用,具体来源忘记了,侵删。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

听 风、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值