Python和C++多尺度导图

104 篇文章 5 订阅
57 篇文章 0 订阅

🎯要点

  1. 热化学属性观测
  2. 蒙特卡罗似然比灵敏度分析时间尺度上动力学
  3. 化学催化反应动力学建模
  4. 自动微分电化学分析模型
  5. 反应动力学数学模型
  6. 渔业生态不确定性模型敏感性分析
  7. 空间统计地理模型分析技术
  8. 多维数据表征实现
  9. 生成艺术图案流苏
  10. 物体长度比,面积比和复杂度数据统计学分析
  11. 二维三维耦合偏微分方程有限元解析
  12. 交通标识识别
    在这里插入图片描述

Python(TensorFlow)结构相似性

结构相似性指数测量是一种预测数字电视和电影画面以及其他类型的数字图像和视频的感知质量的方法。它也用于测量两幅图像之间的相似性,此指数是一个完全参考指标,换句话说,图像质量的测量或预测是基于初始未压缩或无失真图像作为参考的。

结构相似性指数测量是一种基于感知的模型,它将图像质量下降视为结构信息的感知变化,同时还结合了重要的感知现象,包括亮度掩蔽和对比度掩蔽项。与其他技术(如 MSE 或 PSNR)的不同之处在于,这些方法估算绝对误差。结构信息是指像素具有很强的相互依赖性,尤其是当它们在空间上接近时。这些依赖关系包含有关视觉场景中物体结构的重要信息。亮度掩蔽是一种现象,即图像失真(在这种情况下)在明亮区域中往往不太明显,而对比度掩蔽是一种现象,即当图像中存在显着活动或“纹理”时,失真会变得不太明显。

算法

此指数是在图像的各个窗口上计算的。共同大小为 N × N N \times N N×N 的两个窗口 x x x y y y 之间的度量为:
结构相似性指数测量 ⁡ ( x , y ) = ( 2 μ x μ y + c 1 ) ( 2 σ x y + c 2 ) ( μ x 2 + μ y 2 + c 1 ) ( σ x 2 + σ y 2 + c 2 ) \operatorname{结构相似性指数测量}(x, y)=\frac{\left(2 \mu_x \mu_y+c_1\right)\left(2 \sigma_{x y}+c_2\right)}{\left(\mu_x^2+\mu_y^2+c_1\right)\left(\sigma_x^2+\sigma_y^2+c_2\right)} 结构相似性指数测量(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxy+c2)

  • μ x \mu_x μx x x x 的像素样本平均值
  • μ y \mu_y μy y y y 的像素样本平均值
  • σ x 2 \sigma_x^2 σx2 x x x 的方差
  • σ y 2 \sigma_{y}^2 σy2 y y y的方差
  • σ x y \sigma_{x y} σxy x x x y y y 的协方差
  • c 1 = ( k 1 L ) 2 , c 2 = ( k 2 L ) 2 c_1=\left(k_1 L\right)^2, c_2=\left(k_2 L\right)^2 c1=(k1L)2,c2=(k2L)2两个变量来稳定弱分母除法
  • L L L 像素值的动态范围(通常为 2 #  Wits per Pixel  − 1 2^{\# \text { Wits per Pixel }}-1 2# Wits per Pixel 1
  • 默认情况下 k 1 = 0.01 k_1=0.01 k1=0.01 k 2 = 0.03 k_2=0.03 k2=0.03

公式基于 x x x y y y 样本之间的三个比较测量值:亮度 ( l ) (l) (l)、对比度 ( c ) (c) (c) 和结构 (s)。各个比较函数是:
l ( x , y ) = 2 μ x μ y + c 1 μ x 2 + μ y 2 + c 1 c ( x , y ) = 2 σ x σ y + c 2 σ x 2 + σ y 2 + c 2 s ( x , y ) = σ x y + c 3 σ x σ y + c 3 \begin{aligned} & l(x, y)=\frac{2 \mu_x \mu_y+c_1}{\mu_x^2+\mu_y^2+c_1} \\ & c(x, y)=\frac{2 \sigma_x \sigma_y+c_2}{\sigma_x^2+\sigma_y^2+c_2} \\ & s(x, y)=\frac{\sigma_{x y}+c_3}{\sigma_x \sigma_y+c_3} \end{aligned} l(x,y)=μx2+μy2+c12μxμy+c1c(x,y)=σx2+σy2+c22σxσy+c2s(x,y)=σxσy+c3σxy+c3

结构相似性指数测量的更高级形式称为多尺度结构相似性指数测量,它通过多阶段子采样过程在多个尺度上进行,让人想起早期视觉系统中的多尺度处理。事实证明,它在不同的主观图像和视频数据库上的表现与结构相似性指数测量相当或更好。

Python(TensorFlow)多尺度结构相似性指数测量

import numpy as np
from scipy import signal
from scipy.ndimage.filters import convolve
import tensorflow as tf


tf.flags.DEFINE_string('original_image', None, 'Path to PNG image.')
tf.flags.DEFINE_string('compared_image', None, 'Path to PNG image.')
FLAGS = tf.flags.FLAGS


def _FSpecialGauss(size, sigma):

  radius = size // 2
  offset = 0.0
  start, stop = -radius, radius + 1
  if size % 2 == 0:
    offset = 0.5
    stop -= 1
  x, y = np.mgrid[offset + start:stop, offset + start:stop]
  assert len(x) == size
  g = np.exp(-((x**2 + y**2)/(2.0 * sigma**2)))
  return g / g.sum()

def _SSIMForMultiScale(img1, img2, max_val=255, filter_size=11,
                       filter_sigma=1.5, k1=0.01, k2=0.03):

  if img1.shape != img2.shape:
    raise RuntimeError('Input images must have the same shape (%s vs. %s).',
                       img1.shape, img2.shape)
  if img1.ndim != 4:
    raise RuntimeError('Input images must have four dimensions, not %d',
                       img1.ndim)

  img1 = img1.astype(np.float64)
  img2 = img2.astype(np.float64)
  _, height, width, _ = img1.shape

  size = min(filter_size, height, width)

  sigma = size * filter_sigma / filter_size if filter_size else 0

  if filter_size:
    window = np.reshape(_FSpecialGauss(size, sigma), (1, size, size, 1))
    mu1 = signal.fftconvolve(img1, window, mode='valid')
    mu2 = signal.fftconvolve(img2, window, mode='valid')
    sigma11 = signal.fftconvolve(img1 * img1, window, mode='valid')
    sigma22 = signal.fftconvolve(img2 * img2, window, mode='valid')
    sigma12 = signal.fftconvolve(img1 * img2, window, mode='valid')
  else:

    mu1, mu2 = img1, img2
    sigma11 = img1 * img1
    sigma22 = img2 * img2
    sigma12 = img1 * img2

  mu11 = mu1 * mu1
  mu22 = mu2 * mu2
  mu12 = mu1 * mu2
  sigma11 -= mu11
  sigma22 -= mu22
  sigma12 -= mu12

  c1 = (k1 * max_val) ** 2
  c2 = (k2 * max_val) ** 2
  v1 = 2.0 * sigma12 + c2
  v2 = sigma11 + sigma22 + c2
  ssim = np.mean((((2.0 * mu12 + c1) * v1) / ((mu11 + mu22 + c1) * v2)))
  cs = np.mean(v1 / v2)
  return ssim, cs


def MultiScaleSSIM(img1, img2, max_val=255, filter_size=11, filter_sigma=1.5,
                   k1=0.01, k2=0.03, weights=None):

  if img1.shape != img2.shape:
    raise RuntimeError('Input images must have the same shape (%s vs. %s).',
                       img1.shape, img2.shape)
  if img1.ndim != 4:
    raise RuntimeError('Input images must have four dimensions, not %d',
                       img1.ndim)

  # Note: default weights don't sum to 1.0 but do match the paper / matlab code.
  weights = np.array(weights if weights else
                     [0.0448, 0.2856, 0.3001, 0.2363, 0.1333])
  levels = weights.size
  downsample_filter = np.ones((1, 2, 2, 1)) / 4.0
  im1, im2 = [x.astype(np.float64) for x in [img1, img2]]
  mssim = np.array([])
  mcs = np.array([])
  for _ in range(levels):
    ssim, cs = _SSIMForMultiScale(
        im1, im2, max_val=max_val, filter_size=filter_size,
        filter_sigma=filter_sigma, k1=k1, k2=k2)
    mssim = np.append(mssim, ssim)
    mcs = np.append(mcs, cs)
    filtered = [convolve(im, downsample_filter, mode='reflect')
                for im in [im1, im2]]
    im1, im2 = [x[:, ::2, ::2, :] for x in filtered]
  return (np.prod(mcs[0:levels-1] ** weights[0:levels-1]) *
          (mssim[levels-1] ** weights[levels-1]))


def main(_):
  if FLAGS.original_image is None or FLAGS.compared_image is None:
    print('\nUsage: python msssim.py --original_image=original.png '
          '--compared_image=distorted.png\n\n')
    return

  if not tf.gfile.Exists(FLAGS.original_image):
    print('\nCannot find --original_image.\n')
    return

  if not tf.gfile.Exists(FLAGS.compared_image):
    print('\nCannot find --compared_image.\n')
    return

  with tf.gfile.FastGFile(FLAGS.original_image) as image_file:
    img1_str = image_file.read()
  with tf.gfile.FastGFile(FLAGS.compared_image) as image_file:
    img2_str = image_file.read()

  input_img = tf.placeholder(tf.string)
  decoded_image = tf.expand_dims(tf.image.decode_png(input_img, channels=3), 0)

  with tf.Session() as sess:
    img1 = sess.run(decoded_image, feed_dict={input_img: img1_str})
    img2 = sess.run(decoded_image, feed_dict={input_img: img2_str})

  print((MultiScaleSSIM(img1, img2, max_val=255)))


if __name__ == '__main__':
  tf.app.run()

执行:

python msssim.py --original_image=original.png --compared_image=distorted.png

👉更新:亚图跨际

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值