如何处理重叠的矩形?

时间:2019-02-08 17:03:49

标签: python python-3.x opencv rectangles drawrectangle

我正在比较两个图像,并使用compare_ssim查找差异,在这种情况下,我得到了差异的轮廓,需要通过在其周围绘制矩形来突出显示差异,但是我面临的问题是某些矩形彼此重叠我想删除那些重叠的部分。给出的是我的代码和图像。

import os
import csv
from datetime import datetime
from datetime import date
from datetime import timedelta
import tldextract
import time
import requests
import json
from urllib.parse import urlparse
import tldextract
import os
from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw
from skimage.measure import compare_ssim
import numpy as np
import argparse
import imutils
import cv2
import urllib.request as req
import math


def 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) == 4

initial_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)

            else:
                (x, y, w, h) = cv2.boundingRect(c)
                if h >= 7 and w >= 7:
                    changed_w = w + 100
                    changed_h = h + 20
                    changed_x = x - 20
                    cv2.rectangle(secondary, (changed_x, y), (changed_x + changed_w , y + changed_h), (0,255,255), 2)
        complete_path = "result_image.jpg"
        cv2.imwrite( complete_path, secondary );


else:
  continue

enter image description here

1 个答案:

答案 0 :(得分:1)

这听起来像是非最大抑制问题。 Pyimagesearch上有一篇很好的文章,我强烈建议您阅读。您可以使用compare_ssim的结果,类似于本文使用匹配算法的结果。

相关问题