我正在比较两个图像并使用 compare_ssim 找到差异,在这种情况下,我得到了差异的轮廓,我需要通过在其周围绘制矩形来突出显示,但我面临的问题是某些矩形相互重叠我想要删除那些重叠。给定的是我的代码和图像。import osimport csvfrom datetime import datetimefrom datetime import datefrom datetime import timedeltaimport tldextractimport timeimport requestsimport jsonfrom urllib.parse import urlparseimport tldextractimport osfrom PIL import Imagefrom PIL import ImageChopsfrom PIL import ImageDrawfrom skimage.measure import compare_ssimimport numpy as npimport argparseimport imutilsimport cv2import urllib.request as reqimport mathdef is_contour_bad(c): # approximate the contour peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) # the contour is 'bad' if it is not a rectangle return not len(approx) == 4initial_view = "first_image.jpg"secondary_view = "seconda_image.jpg"initial = cv2.imread(initial_view)secondary = cv2.imread(secondary_view)size_of_initial_image = heighta, widtha = initial.shape[:2]size_of_secondary_image = heightb, widthb = secondary.shape[:2]if size_of_initial_image == size_of_secondary_image: grayA = cv2.cvtColor(initial, cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(secondary, cv2.COLOR_BGR2GRAY) (score, diff) = compare_ssim(grayA, grayB, full=True) diff = (diff * 255).astype("uint8") if score == 1.0: print('images are identical') else: 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] # output = secondary.copy() # alpha = 0.3 threshold_area = 1000 for c in cnts: if is_contour_bad(c): pass area = cv2.contourArea(c) if area > threshold_area: (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(secondary, (x, y), (x + w , y + h), (0,255,255), 2)
1 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
这听起来像是非最大抑制的问题。 Pyimagesearch有一篇很好的文章,我强烈推荐阅读。您可以使用类似于文章如何使用匹配算法的结果的 compare_ssim 的结果。
添加回答
举报
0/150
提交
取消