SSIM(結構相似性)

2021-09-12 12:22:03 字數 3173 閱讀 5701

ssim可以抵消mse無法衡量影象結構相似性的缺陷。

其中:α、β、γ均大於0

上式中,μ_x,μ_y為影象塊所有畫素;δ_x,δ_y為影象畫素值的標準差;δ_xy為x與y的協方差;c_1,c_2,c_3為常數,為避免分母為0時帶來的系統錯誤。

在實際應用中,α=β=γ=1,c_3= 0.5c_2,則ssim表示式為:

ssim具有對稱性。即ssim(x,y)=ssim(y,x)

ssim是乙個0到1之間的數,ssim越大,兩影象間差異越小。

tf.image.ssim(img1,img2,max_val)

max_val:影象的動態範圍(即最大允許值和最小允許值之間的差值)。

注意:真正的ssim僅在灰度上定義。 此函式不執行任何顏色空間轉換。 (如果輸入已經是yuv,那麼它將計算yuv ssim平均值。)

使用python實現

import tensorflow as tf

import numpy as np

import scipy.misc

import os

os.environ["tf_cpp_min_log_level"]='2'

def _tf_fspecial_gauss(size, sigma=1.5):

x_data, y_data = np.mgrid[-size//2 + 1:size//2 + 1, -size//2 + 1:size//2 + 1]

x_data = np.expand_dims(x_data, axis=-1)#擴充套件陣列的形狀

x_data = np.expand_dims(x_data, axis=-1)

y_data = np.expand_dims(y_data, axis=-1)

y_data = np.expand_dims(y_data, axis=-1)

x = tf.constant(x_data, dtype=tf.float32)

y = tf.constant(y_data, dtype=tf.float32)

g = tf.exp(-((x**2 + y**2)/(2.0*sigma**2)))

return g / tf.reduce_sum(g)

def ssim(img1, img2, k1=0.01, k2=0.02, l=1, window_size=11):

img1 = tf.expand_dims(img1, 0)

img1 = tf.expand_dims(img1, -1)

img2 = tf.expand_dims(img2, 0)

img2 = tf.expand_dims(img2, -1)

window = _tf_fspecial_gauss(window_size)

mu1 = tf.nn.conv2d(img1, window, strides = [1, 1, 1, 1], padding = 'valid')

mu2 = tf.nn.conv2d(img2, window, strides = [1, 1, 1, 1], padding = 'valid')

mu1_sq = mu1 * mu1

mu2_sq = mu2 * mu2

mu1_mu2 = mu1 * mu2

sigma1_sq = tf.nn.conv2d(img1*img1, window, strides = [1 ,1, 1, 1], padding = 'valid') - mu1_sq

sigma2_sq = tf.nn.conv2d(img2*img2, window, strides = [1, 1, 1, 1], padding = 'valid') - mu2_sq

sigma1_2 = tf.nn.conv2d(img1*img2, window, strides = [1, 1, 1, 1], padding = 'valid') - mu1_mu2

c1 = (k1*l)**2

c2 = (k2*l)**2

ssim_map = ((2*mu1_mu2 + c1)*(2*sigma1_2 + c2)) / ((mu1_sq + mu2_sq + c1)*(sigma1_sq + sigma2_sq + c2))

return tf.reduce_mean(ssim_map)

img1 = np.array(scipy.misc.imread('tree.png', mode='rgb').astype('float32'))

img2 = np.array(scipy.misc.imread('tree2.png', mode='rgb').astype('float32'))

img1 = tf.constant(img1)

img2 = tf.constant(img2)

_ssim_ = tf.image.ssim(img1, img2, 1.0)

rgb1 = tf.unstack(img1, axis=2)

r1 = rgb1[0]

g1 = rgb1[1]

b1 = rgb1[2]

rgb2 = tf.unstack(img2, axis=2)

r2 = rgb2[0]

g2 = rgb2[1]

b2 = rgb2[2]

ssim_r=ssim(r1,r2)

ssim_g=ssim(g1,g2)

ssim_b=ssim(b1,b2)

ssim = tf.reduce_mean(ssim_r+ssim_g+ssim_b)/3

with tf.session() as sess:

with tf.session() as sess:

print('tf.image.ssim: ',sess.run(_ssim_))

print('ssim: ',sess.run(ssim))

相似性度量

二元向量的相似性度量 每一維都少的資訊量,主要是0,1等有 or 沒有屬性 dice 2 x y x y 2保證 0,1 維數不一致時,差別大。jaccard x y x y 交疊程度小時,值較低 交疊係數 x y min 互相之間的包含性,1 cosine x y 根號 x y 對於實值 只有co...

資料相似性

首先模擬一些資料出來 假設有這樣一些id是1 5的條目,然後有幾個人對他們看過的條目進行了評分 1 5 那麼我們可能有這樣的一組資料,格式是 人名 a b c 給定兩個人,如何計算他們的相似度,比如,在b和c裡,誰和a的評分最相似?給出一些方法 1 簡單匹配係數 matching coefficie...

相似性度量

一般而言,定義乙個距離函式d x,y 需要滿足以下幾個準則 1.d x,x 0 到自己的距離為0 2.d x,y 0 距離要非負 3.對稱性,d x,y d y,x 如果a到b距離是a,那麼b到a的距離也應該是a 4.三角形法則 兩個之和大於第三邊 d x,k d k,y d x,y 滿足這4個條件...