您好,登錄后才能下訂單哦!
最近項(xiàng)目中需要實(shí)現(xiàn)兩組圖片對(duì)比,并能將兩者的區(qū)別標(biāo)識(shí)出來。
在網(wǎng)上搜索一大堆找到一篇大神的文章,最終實(shí)現(xiàn)該功能,在這里記錄下:
想要實(shí)現(xiàn)此demo,首先我們得確保電腦上已安裝 openCV 和 Python 兩個(gè)工具以及scikit-image和imutils兩個(gè)庫:
安裝方法,在這里不多說,我安裝的是Python3.6 和openCV2,安裝方法網(wǎng)上自行百度谷歌;
進(jìn)入正題:
新建一個(gè)新的Python文件并命名為copmarePicture.py,寫入下面的代碼:
from skimage.measure import compare_ssim #~ import skimage as ssim import argparse import imutils import cv2
加載兩張圖片并將他們轉(zhuǎn)換為灰度:
imageA = cv2.imread("D:/111test/111.png") imageB = cv2.imread("D:/111test/444.png") grayA = cv2.cvtColor(imageA,cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(imageB,cv2.COLOR_BGR2GRAY)
接下來,計(jì)算兩個(gè)灰度圖像之間的結(jié)構(gòu)相似度指數(shù):
(score,diff) = compare_ssim(grayA,grayB,full = True) diff = (diff *255).astype("uint8") print("SSIM:{}".format(score))
找到不同點(diǎn)的輪廓以致于我們可以在被標(biāo)識(shí)為“不同”的區(qū)域周圍放置矩形:
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 = cnts[0] if imutils.is_cv2() else cnts[1]
找到一系列區(qū)域,在區(qū)域周圍放置矩形:
for c in cnts: (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)
用cv2.imshow 展現(xiàn)最終對(duì)比之后的圖片, cv2.imwrite 保存最終的結(jié)果圖片
cv2.imshow("Modified",imageB) cv2.imwrite("haha2.png",imageB) cv2.waitKey(0)
到這已經(jīng)實(shí)現(xiàn)兩張圖片的對(duì)比并標(biāo)識(shí)出不同。結(jié)果如下所示:(圖1圖2對(duì)比,圖3為對(duì)標(biāo)結(jié)果
以上這篇用openCV和Python 實(shí)現(xiàn)圖片對(duì)比,并標(biāo)識(shí)出不同點(diǎn)的方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。