如何处理重叠的矩形? [英] How can I deal with overlapping rectangles?

查看:181
本文介绍了如何处理重叠的矩形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am comparing two images and find the difference using compare_ssim, in that case I got the contours of differences, which i need to highlight by drawing rectangle around it, but I am facing the issue that some of the rectangles overlapping each other I want to remove those overlapping. Given is my code and the image.

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

推荐答案

这听起来像是非最大抑制问题. Pyimagesearch 具有很好的性能我强烈建议您阅读其中的文章.您可以使用compare_ssim的结果,类似于文章使用匹配算法的结果.

This sounds like a problem for Non Maximum Suppression. Pyimagesearch has a pretty good article on it which I highly recommend reading. You can use the result of compare_ssim similar to how the article uses the result of the matching algorithm.

这篇关于如何处理重叠的矩形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆