Python 比较俩张图片差异
對比倆張圖片差異,可以用均方誤差(MSE)與結(jié)構(gòu)相似性指數(shù)(SSIM)函數(shù)。(Mean Squared Error vs. Structural Similarity Measure)
使用此方法,我們能夠輕松確定兩個圖像是相同的還是由于輕微的圖像操作,壓縮偽像或有目的的篡改而有所不同。
盡管MSE的計算速度要快得多,但它的主要缺點是(1)全局應(yīng)用,(2)僅估計圖像的感知錯誤。
另一方面,SSIM雖然速度較慢,但??可以通過比較圖像的局部區(qū)域而不是全局圖像來感知圖像的結(jié)構(gòu)信息的變化。 那么您應(yīng)該使用哪種方法?
一般來說,SSIM會為您帶來更好的結(jié)果,但會降低性能。 但是我認(rèn)為,準(zhǔn)確性的提高是值得的。
MSE的值為0表示完全相似。大于1的值表示相似度較小,MSE的值隨著像素強(qiáng)度之間的平均差增加而將繼續(xù)增長。MSE值域在[0,…)
SSIM的值為1表示完全相似。值越小表示相似性越差。SSIM的值域在[-1,1]之間。
MSE與SSIM的方法比較倆張圖片的前提是倆張圖片的大小是一樣的。
大小不一樣的,可以學(xué)習(xí)cv.resize(),放大縮小到同一大小后進(jìn)行比較。
1. MSE 均方誤差介紹
MSE核心是逐個像素差的平方和,除以像素的個數(shù)。
MSE的實現(xiàn)非常簡單,但是將其用于相似性時,我們可能會遇到問題。主要的一點是,像素強(qiáng)度之間的較大距離并不一定意味著圖像的內(nèi)容有很大不同。
為了糾正與MSE相關(guān)的一些圖像比較問題,我們使用了Wang等人開發(fā)的結(jié)構(gòu)相似性指數(shù)函數(shù)。
二、結(jié)構(gòu)相似性指數(shù)
SSIM方法顯然比MSE方法更復(fù)雜,但是要點是SSIM試圖對圖像的結(jié)構(gòu)信息中感知到的變化建模,而MSE實際上是在評估感知到的錯誤。兩者之間有細(xì)微的差別,但結(jié)果卻是驚人的。
MSE只考慮感知到的變化,而SSIM則考慮到了圖像結(jié)構(gòu)的變化(如公式中對于圖像中N x N窗口的(x,y)位置,x和y方向上像素強(qiáng)度的平均值,x和y方向上強(qiáng)度的方差以及協(xié)方差。 ),是一種更健壯的方法。
# import the necessary packages
from skimage.metrics import structural_similarity as ssim
import matplotlib.pyplot as plt
import numpy as np
import cv2def mse(imageA, imageB):# 均方誤差方法用 python實現(xiàn)# 計算倆張圖片的像素差的平方和的平均值# 倆張圖必須有相同的 分辨率維度err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)err /= float(imageA.shape[0] * imageA.shape[1])# return the MSE, the lower the error, the more "similar"# the two images arereturn errdef compare_images(imageA, imageB, title):# 計算倆張圖片的均方誤差 及 結(jié)構(gòu)相似性指數(shù)m = mse(imageA, imageB)s = ssim(imageA, imageB)# 設(shè)置圖片的名稱標(biāo)頭fig = plt.figure(title)plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, s))# 展示第一張圖ax = fig.add_subplot(1, 2, 1)plt.imshow(imageA, cmap=plt.cm.gray)plt.axis("off")# 展示第二張圖ax = fig.add_subplot(1, 2, 2)plt.imshow(imageB, cmap=plt.cm.gray)plt.axis("off")# 展示圖片plt.show()def main():# 加載圖片 —— 初始,對比,ps操作過的original = cv2.imread("D:/pyimagesearch/images/origin.jpg")contrast = cv2.imread("D:/pyimagesearch/images/contrast.jpg")shopped = cv2.imread("D:/pyimagesearch/images/photoshopped.jpg")# convert the images to grayscaleoriginal = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)contrast = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY)shopped = cv2.cvtColor(shopped, cv2.COLOR_BGR2GRAY)# 初始化圖表fig = plt.figure("Images")images = ("Original", original), ("Contrast", contrast), ("Photoshopped", shopped)# 循環(huán)遍歷三張圖片for (i, (name, image)) in enumerate(images):# 加載入圖片ax = fig.add_subplot(1, 3, i + 1)ax.set_title(name)plt.imshow(image, cmap=plt.cm.gray)plt.axis("off")# 展示圖片plt.show()# 分別比較圖片compare_images(original, original, "Original vs. Original")compare_images(original, contrast, "Original vs. Contrast")compare_images(original, shopped, "Original vs. Photoshopped")if __name__ == "__main__":main()
結(jié)果圖如下:
與原圖相比 MSE: 0,SSIM:1 無限相似
與contrast對比圖,顯然不夠像
與photoshop操作過加了前綴圖的要比 contrast相似些。
參考:How-To: Python Compare Two Images
總結(jié)
以上是生活随笔為你收集整理的Python 比较俩张图片差异的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曾经拥有是哪首歌啊?
- 下一篇: python-pcl官网 应用、特征、过