用openCV 和 Python 實現圖片對比,並標識出不同點
阿新 • • 發佈:2018-12-30
最近專案中需要實現兩組圖片對比,並能將兩者的區別標識出來。
在網上搜索一大堆找到一篇大神的文章,最終實現該功能,在這裡記錄下:
想要實現此demo,首先我們得確保電腦上已安裝 openCV 和 Python 兩個工具以及scikit-image和imutils兩個庫:
安裝方法,在這裡不多說,我安裝的是Python3.6 和openCV2,安裝方法網上自行百度谷歌;
進入正題:
新建一個新的Python檔案並命名為copmarePicture.py,寫入下面的程式碼:
from skimage.measure import compare_ssim
#~ import skimage as ssim
import argparse
import imutils
import cv2
載入兩張圖片並將他們轉換為灰度:
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)
接下來,計算兩個灰度影象之間的結構相似度指數:
(score,diff) = compare_ssim(grayA,grayB,full = True)
diff = (diff *255 ).astype("uint8")
print("SSIM:{}".format(score))
找到不同點的輪廓以致於我們可以在被標識為“不同”的區域周圍放置矩形:
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]
找到一系列區域,在區域周圍放置矩形:
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 展現最終對比之後的圖片, cv2.imwrite 儲存最終的結果圖片
cv2.imshow("Modified",imageB)
cv2.imwrite("haha2.png",imageB)
cv2.waitKey(0)
到這已經實現兩張圖片的對比並標識出不同。結果如下所示:(圖1圖2對比,圖3為對標結果