溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用OpenCV快速尋找圖像差異處

發(fā)布時間:2021-12-15 18:29:35 來源:億速云 閱讀:147 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何用OpenCV快速尋找圖像差異處,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

如何用OpenCV快速尋找圖像差異處

如何使用結(jié)構(gòu)相似性指數(shù)(SSIM)將兩個圖像與Python進行比較。

使用這種方法,我們能夠輕松確定兩個圖像是否相同或由于輕微的圖像處理,壓縮偽像或有目的的篡改而產(chǎn)生差異。

今天我們將擴展SSIM方法,以便我們可以使用OpenCV和Python可視化圖像之間的差異。具體來說,我們將在兩個不同的輸入圖像中的區(qū)域周圍繪制邊界框。

與OpenCV和Python的圖像差異

為了計算兩個圖像之間的差異,我們將利用結(jié)構(gòu)相似性指數(shù),由Wang等人首先介紹。在2004年的論文中,圖像質(zhì)量評估:從錯誤可見性到結(jié)構(gòu)相似性。此方法已在scikit-image 庫中實現(xiàn)以進行圖像處理。

訣竅是學習如何根據(jù)(x,y) -坐標位置精確確定圖像差異的位置。

為此,我們首先需要確保我們的系統(tǒng)具有Python,OpenCV,scikit-image和imutils。

您可以使用我的OpenCV安裝教程學習如何在系統(tǒng)上配置和安裝Python和OpenCV 。

如果您還沒有 scikit - 已安裝/升級映像,請通過以下方式升級:


 $ pip install --upgrade scikit-image

當你在這里時,繼續(xù)安裝/升級 imutils :


$ pip install --upgrade imutils

現(xiàn)在我們的系統(tǒng)已經(jīng)準備好了先決條件,讓我們繼續(xù)。

計算圖像差異

你能發(fā)現(xiàn)這兩個圖像之間的區(qū)別嗎?

如何用OpenCV快速尋找圖像差異處

圖1:手動檢查兩個輸入圖像(源)之間的差異

如果您花一秒鐘研究這兩張信用卡,您會注意到MasterCard徽標出現(xiàn)在 左側(cè)圖像上,但已從右側(cè)圖像中刪除 。

您可能已經(jīng)立即注意到這種差異,或者可能已經(jīng)花了幾秒鐘。無論哪種方式,這都證明了比較圖像差異的一個重要方面 - 有時圖像差異是微妙的 - 如此微妙以至于肉眼難以立即理解差異(我們將在本博文后面看到這樣一個圖像的例子)。

那么為什么計算圖像差異如此重要呢?

一個例子是 網(wǎng)絡(luò)釣魚。攻擊者可以稍微操縱圖像,以欺騙不驗證URL的毫無戒心的用戶,使他們認為他們正在登錄他們的銀行網(wǎng)站 - 后來發(fā)現(xiàn)這是一個騙局。

將網(wǎng)頁上的徽標和已知用戶界面(UI)元素與現(xiàn)有數(shù)據(jù)集進行比較有助于減少網(wǎng)絡(luò)釣魚攻擊(非常感謝Chris Cleveland傳遞 PhishZoo:通過查看網(wǎng)絡(luò)釣魚網(wǎng)站作為應(yīng)用計算機視覺預(yù)防的示例來檢測網(wǎng)絡(luò)釣魚網(wǎng)站網(wǎng)絡(luò)釣魚)。

開發(fā)網(wǎng)絡(luò)釣魚檢測系統(tǒng)顯然比簡單的圖像差異復雜得多,但我們?nèi)匀豢梢詰?yīng)用這些技術(shù)來確定是否已經(jīng)操縱了給定的圖像。

現(xiàn)在,讓我們計算兩個圖像之間的差異,并使用OpenCV,scikit-image和Python并排查看差異。

打開一個新文件并將其命名為 image_diff .py ,并插入以下代碼:


# import the necessary packages
from skimage.measure import compare_ssim
import argparse
import imutils
import cv2

 
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-f", "--first", required=True,

 help="first input image")
ap.add_argument("-s", "--second", required=True,

 help="second")
args = vars(ap.parse_args())
# load the two input images
imageA = cv2.imread(args["first"])
imageB = cv2.imread(args["second"])

 
# convert the images to grayscale
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
# compute the Structural Similarity Index (SSIM) between the two
# images, ensuring that the difference image is returned
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {}".format(score))
# threshold the difference image, followed by finding contours to
# obtain the regions of the two input images that differ
thresh = cv2.threshold(diff, 0, 255,

 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,

 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# loop over the contours
for c in cnts:

 # compute the bounding box of the contour and then draw the

 # bounding box on both input images to represent where the two

 # images differ

 (x, y, w, h) = cv2.boundingRect(c)

 cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)

 cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

 
# show the output images
cv2.imshow("Original", imageA)
cv2.imshow("Modified", imageB)
cv2.imshow("Diff", diff)
cv2.imshow("Thresh", thresh)
cv2.waitKey(0)

第2-5行顯示我們的進口。我們將使用 compare_ssim (來自scikit-image), argparse , imutils 和 cv2 (OpenCV)。

我們建立兩個命令行參數(shù), - first 和 - second ,它們是我們希望比較的兩個相應(yīng)輸入圖像的路徑(第8-13行)。

接下來,我們將從磁盤加載每個圖像并將其轉(zhuǎn)換為灰度:

我們載入我們的第一和第二圖像, - 第一 和 - 第二 ,上 線16和17,它們存儲為 imageA 和 imageB 分別。

如何用OpenCV快速尋找圖像差異處

然后我們在第20行和第21行將每個轉(zhuǎn)換為灰度。

如何用OpenCV快速尋找圖像差異處

接下來,讓我們計算兩個灰度圖像之間的結(jié)構(gòu)相似性指數(shù)(SSIM)。

使用 scikit-image中的 compare_ssim函數(shù),我們計算 得分 和差異圖像 diff (第25行)。

所述 得分 表示兩個輸入圖像之間的結(jié)構(gòu)相似性指數(shù)。該值可以落在[-1,1]范圍內(nèi) ,值為1是“完美匹配”。

該 差異 的圖像包含實際 圖像的差異 ,我們希望以可視化的兩個輸入圖像之間。差異圖像當前表示為[0,1]范圍內(nèi)的浮點數(shù)據(jù)類型, 因此我們首先將數(shù)組轉(zhuǎn)換為[0,255](第26行)范圍內(nèi)的8位無符號整數(shù), 然后我們才能進一步處理它使用OpenCV。

現(xiàn)在,讓我們找到輪廓,以便我們可以在標識為“不同”的區(qū)域周圍放置矩形:

在 第31行和第32行,我們 使用cv2對我們的差異圖像進行 閾值 處理。THRESH_BINARY_INV 和 cv2 。THRESH_OTSU - 使用垂直條'或'符號,|同時應(yīng)用這兩個設(shè)置 。有關(guān)Otsu雙峰閾值設(shè)置的詳細信息,請參閱此OpenCV文檔。

隨后我們 在 第33-35行找到了thresh的輪廓 。第35行的三元運算符 簡單地適應(yīng)了各種版本的OpenCV中cv2.findContours返回簽名之間的差異。

下面圖4中的圖像清楚地顯示了已被操縱的圖像的ROI:

如何用OpenCV快速尋找圖像差異處

圖4:使用閾值處理使用OpenCV和Python突出顯示圖像差異。

從第38行開始 ,我們遍布我們的輪廓, cnts 。首先,我們使用cv2計算輪廓周圍的邊界框 。boundingRect 函數(shù)。我們將相關(guān)的 (x,y )坐標存儲為 x 和 y 以及矩形的寬度/高度為 w 和 h 。

然后我們使用這些值在每個圖像上用cv2繪制一個紅色矩形 。矩形 (第43和44行)。

最后,我們用差異圖像,差異圖像和閾值圖像顯示比較圖像(第47-50行)。

我們打電話給 cv2 。waitKey 上 50線,直到按下一個鍵,這使得程序等待(此時腳本將退出)。

如何用OpenCV快速尋找圖像差異處

接下來,讓我們運行腳本并可視化一些圖像差異。

可視化圖像差異

使用此腳本和以下命令,我們可以快速輕松地突出顯示兩個圖像之間的差異:


$ python image_diff.py --first images/original_02.png 

 --second images/modified_02.png

正如您在圖6中看到的那樣,安全芯片和帳戶持有者的名稱都被刪除了:

如何用OpenCV快速尋找圖像差異處

讓我們嘗試另一個計算圖像差異的例子,這次是由杰拉爾德·R·福特總統(tǒng)(來源)撰寫的支票。

通過運行下面的命令并提供相關(guān)圖像,我們可以看到這里的差異更加微妙:


$ python image_diff.py --first images/original_03.png 

 --second images/modified_03.png

如何用OpenCV快速尋找圖像差異處

請注意圖7中的以下更改:

  • 貝蒂福特的名字被刪除了。

  • 支票號碼已刪除。

  • 日期旁邊的符號將被刪除。

  • 姓氏已刪除。

在像檢查這樣的復雜圖像上,通常很難用肉眼找到 所有差異。幸運的是,我們現(xiàn)在可以使用Python,OpenCV和scikit-image制作的這個方便的腳本輕松計算差異并可視化結(jié)果。

上述就是小編為大家分享的如何用OpenCV快速尋找圖像差異處了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI