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個條件...