如何用OpenCV快速尋找圖像差異處-創(chuàng)新互聯(lián)

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

海興網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),海興網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為海興上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的海興做網(wǎng)站的公司定做!

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

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

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

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

與OpenCV和Python的圖像差異

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

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

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

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

如果您還沒(méi)有 scikit - 已安裝/升級(jí)映像,請(qǐng)通過(guò)以下方式升級(jí):

 $ pip install --upgrade scikit-image

當(dāng)你在這里時(shí),繼續(xù)安裝/升級(jí) imutils :

$ pip install --upgrade imutils

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

計(jì)算圖像差異

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

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

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

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

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

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

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

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

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

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

打開(kāi)一個(gè)新文件并將其命名為 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行顯示我們的進(jìn)口。我們將使用 compare_ssim (來(lái)自scikit-image), argparse , imutils 和 cv2 (OpenCV)。

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

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

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

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

然后我們?cè)诘?0行和第21行將每個(gè)轉(zhuǎn)換為灰度。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

接下來(lái),讓我們運(yùn)行腳本并可視化一些圖像差異。

可視化圖像差異

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

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

 --second images/modified_02.png

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

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

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

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

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

 --second images/modified_03.png

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

請(qǐng)注意圖7中的以下更改:

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

  • 支票號(hào)碼已刪除。

  • 日期旁邊的符號(hào)將被刪除。

  • 姓氏已刪除。

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

上述就是小編為大家分享的如何用OpenCV快速尋找圖像差異處了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

網(wǎng)頁(yè)題目:如何用OpenCV快速尋找圖像差異處-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article22/dsehjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、定制網(wǎng)站、網(wǎng)站制作電子商務(wù)、網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)