图片的 异或操作,比对两张图片的大致不同的,并圈取出来
import cv2
import numpy as np
import matplotlib as plt
pp0="1-0.jpg"
pp1="1-3.jpg"
pp2="1-4.jpg"
#读取图片
img_0=cv2.imread(pp0,cv2.IMREAD_ANYCOLOR)
img_1=cv2.imread(pp1,cv2.IMREAD_ANYCOLOR)
img_2=cv2.imread(pp2,cv2.IMREAD_ANYCOLOR)
def progresss(img):
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
grayx=cv2.Sobel(img,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
grayy=cv2.Sobel(img,ddepth=cv2.CV_32F,dx=0,dy=1,ksize=-1)
gradinet=cv2.subtract(grayx,grayy)
gradinet=cv2.convertScaleAbs(gradinet)
blurredA=cv2.blur(gradinet,(25,25))#(?,?)内核滤波
(_, threshA) = cv2.threshold(blurredA, 90, 255, cv2.THRESH_BINARY)#亮度不大于90的为黑色
kernelA = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))#形态学操作膨胀
closedA = cv2.morphologyEx(threshA, cv2.MORPH_CLOSE, kernelA)
closedA = cv2.erode(closedA, None, iterations=2)
img = cv2.dilate(closedA, None, iterations=2)
return img
img_0_gray=progresss(img_0)
img_1_gray=progresss(img_1)
img_2_gray=progresss(img_2)
#图片异或操作
results_0_1=cv2.bitwise_xor(img_1_gray,img_2_gray)
#形态学腐蚀
results_0_1 = cv2.erode(results_0_1, None, iterations=4)
_,cnts,hierarchy = cv2.findContours(results_0_1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_1,cnts,-1,(0,0,255),3)
cv2.drawContours(img_2,cnts,-1,(0,0,255),3)
cv2.imshow('img',img_1)
cv2.imshow('img2',img_2)
cv2.imshow('results_0_1',results_0_1)
cv2.waitKey()
cv2.destroyAllWindows()