柚子快報激活碼778899分享:算法 評估數(shù)據(jù)相似度的幾種方法
柚子快報激活碼778899分享:算法 評估數(shù)據(jù)相似度的幾種方法
1、結(jié)構(gòu)化相似性指數(shù) (SSIM)
優(yōu)點:綜合考慮了亮度、對比度和結(jié)構(gòu)(圖像中的邊緣和紋理等高頻信息)等因素。 缺點:不考慮色彩信息
import cv2
# 函數(shù):計算兩張圖片的結(jié)構(gòu)化相似性(SSIM)
def calculate_ssim(image1, image2):
# 讀取圖片
img1 = cv2.imread(image1)
img2 = cv2.imread(image2)
# 將圖片轉(zhuǎn)換為灰度圖
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 計算SSIM,分數(shù)范圍通常是 ([-1, 1]),其中 1 表示完全相似,-1 表示完全不同,0 表示沒有任何相似性
(score, _) = cv2.compareSSIM(gray1, gray2, full=True)
return score
【注】轉(zhuǎn)為灰度的原因是1、不考慮色彩信息;2、加快計算速度。
2、峰值信噪比 (PSNR)
主要用于比較同一圖像的不同版本之間的質(zhì)量,如圖像壓縮算法評估、圖像復(fù)原等, 而不是用于比較不同圖像之間的質(zhì)量。 【注意】因為 PSNR 的計算是基于圖像的像素值之間的均方誤差(MSE)來衡量的,即使兩張圖像的質(zhì)量相同,但如果它們的像素值分布不同,PSNR 的值也可能不同,所以PSNR 主要用于比較同一圖像的不同版本之間的質(zhì)量,而不是用于比較不同圖像之間的質(zhì)量。
import cv2
# 函數(shù):計算兩張圖片的峰值信噪比(PSNR)
def calculate_psnr(image1, image2):
# 讀取圖片
img1 = cv2.imread(image1)
img2 = cv2.imread(image2)
# 計算PSNR,其返回值范圍通常是正值。PSNR 的值越高,表示圖像質(zhì)量越好,對于 8 位圖像,PSNR 的典型范圍在 20 到 50 之間,取決于圖像的內(nèi)容和失真程度。
psnr = cv2.PSNR(img1, img2)
return psnr
3、直方圖比較
通過比較圖像的直方圖來評估它們的相似度。適用于顏色分布較為重要的場景,如圖像檢索、圖像分類等。
import cv2
# 函數(shù):計算兩張圖片的直方圖相似度
def calculate_hist_similarity(image1, image2):
# 讀取圖片
img1 = cv2.imread(image1)
img2 = cv2.imread(image2)
# 計算直方圖
hist1 = cv2.calcHist([img1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist2 = cv2.calcHist([img2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
# 計算直方圖相似度,返回值范圍通常在0到1之間,0 表示兩個直方圖之間完全不相似,1 表示兩個直方圖之間完全相同。
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
return similarity
4、均值哈希 (Average Hash)
將圖像轉(zhuǎn)換為哈希碼,并比較哈希碼之間的差異來評估圖像相似度。適用于快速計算圖像相似度的場景,如圖像搜索、重復(fù)圖片檢測等。 缺點: 1、均值哈希是基于圖像的整體信息,即將圖像縮小為一個小尺寸的圖像,然后計算其均值作為哈希值。在這個過程中,大量的圖像細節(jié)信息被丟失,導(dǎo)致哈希值無法捕捉到圖像的局部特征和細微變化。因此,對于涉及到局部特征變化的復(fù)雜變換,均值哈希往往無法準確地區(qū)分不同圖像之間的差異。 2、均值哈希通常只使用灰度信息來計算哈希值,不會考慮到像素的顏色信息。
import imagehash
from PIL import Image
# 函數(shù):計算兩張圖片的均值哈希(Average Hash)相似度,介于0到1之間的浮點數(shù),如果返回值接近1,表示兩個圖像非常相似;如果返回值接近0,表示兩個圖像差異很大。
def calculate_avg_hash_similarity(image1, image2):
hash1 = imagehash.average_hash(Image.open(image1))
hash2 = imagehash.average_hash(Image.open(image2))
similarity = 1 - (hash1 - hash2) / len(hash1.hash) ** 2
return similarity
5、感知哈希 (Perceptual Hash)
類似于均值哈希,但在計算哈希碼時考慮了圖像的感知特征,使得哈希碼更加符合人類視覺系統(tǒng)的感知。適用于圖像搜索、版權(quán)保護等場景。 優(yōu)點:
1、 感知哈希考慮了圖像的顏色信息,但對于顏色的變化并不敏感,因此在一定程度上可以應(yīng)對色彩變化。 2、感知哈希在計算哈希值時會考慮到圖像的局部特征,能夠比較好地應(yīng)對一些常見的圖像變換,因此在圖像檢索、相似度匹配等應(yīng)用中表現(xiàn)較為穩(wěn)定。 缺點: 1、感知哈希算法通常涉及到較復(fù)雜的圖像處理和特征提取過程,因此計算復(fù)雜
import imagehash
from PIL import Image
# 函數(shù):計算兩張圖片的感知哈希(Perceptual Hash)相似度,介于0到1之間的浮點數(shù),如果返回值接近1,表示兩個圖像非常相似;如果返回值接近0,表示兩個圖像差異很大。
def calculate_phash_similarity(image1, image2):
hash1 = imagehash.phash(Image.open(image1))
hash2 = imagehash.phash(Image.open(image2))
similarity = 1 - (hash1 - hash2) / len(hash1.hash) ** 2
return similarity
6、結(jié)構(gòu)化相似矩陣 (SSD)
比較兩個結(jié)構(gòu)化數(shù)據(jù)(例如文本、圖像、音頻等)之間相似性的方法 缺點: 1、計算復(fù)雜度高: 計算結(jié)構(gòu)化相似度矩陣需要對每對數(shù)據(jù)進行特征提取和相似度計算,這在數(shù)據(jù)規(guī)模較大時會導(dǎo)致計算復(fù)雜度較高。 2、依賴特征提取方法: 結(jié)構(gòu)化相似度矩陣的計算結(jié)果很大程度上取決于所選擇的特征提取方法。 3、數(shù)據(jù)結(jié)構(gòu)要求高: SSD通常要求數(shù)據(jù)具有一定的結(jié)構(gòu)性,比如圖像要具有明顯的區(qū)域、文本要有清晰的語義等。對于一些非結(jié)構(gòu)化數(shù)據(jù)或者噪聲較多的數(shù)據(jù),SSD可能無法有效地計算相似度。 4、難以處理高維數(shù)據(jù): 高維數(shù)據(jù)(如高分辨率圖像、大規(guī)模文本數(shù)據(jù))的相似度計算通常會面臨維度災(zāi)難問題,SSD在處理這些數(shù)據(jù)時可能會受到限制。
import cv2
import numpy as np
# 函數(shù):計算兩張圖片的結(jié)構(gòu)化相似度矩陣(SSD)
def calculate_ssd(image1, image2):
# 讀取圖片
img1 = cv2.imread(image1, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(image2, cv2.IMREAD_GRAYSCALE)
# 計算SSD,返回值范圍是非負實數(shù),表示兩幅圖像之間的差異程度。越大,表示兩幅圖像之間的差異越大,反之則表示兩幅圖像之間的相似度越高。
ssd = np.sum((img1 - img2) ** 2)
return ssd
結(jié)合使用
在實際使用時,可以將多個維度的指標結(jié)合起來 如,將直方圖和SSMI結(jié)合: 直方圖捕獲圖像的顏色分布信息,而 SSMI 則可以考慮圖像的結(jié)構(gòu)信息。
import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim
def calculate_image_similarity(image1, image2):
# 讀取彩色圖像
img1 = cv2.imread(image1)
img2 = cv2.imread(image2)
# 轉(zhuǎn)換為 HSV 顏色空間
hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
# 計算彩色直方圖
hist1 = cv2.calcHist([hsv1], [0, 1], None, [180, 256], [0, 180, 0, 256])
hist2 = cv2.calcHist([hsv2], [0, 1], None, [180, 256], [0, 180, 0, 256])
# 歸一化直方圖
hist1 /= hist1.sum()
hist2 /= hist2.sum()
# 計算直方圖相似度
hist_similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
# 轉(zhuǎn)換為灰度圖像
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 計算結(jié)構(gòu)相似度
ssmi, _ = ssim(img1_gray, img2_gray, full=True)
# 組合得分,組合的方式可以自行定義
final_score = 0.5 * hist_similarity + 0.5 * ssmi
return final_score
柚子快報激活碼778899分享:算法 評估數(shù)據(jù)相似度的幾種方法
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。