我该如何处理重叠的矩形? [关闭]

问题描述 投票:-1回答:1

我比较两个图像,并发现使用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

python python-3.x opencv rectangles drawrectangle
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.