【发布时间】:2019-07-02 23:25:09
【问题描述】:
我正在比较两个图像并使用 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
【问题讨论】:
-
我不确定您认为什么是好的解决方案。如果你想要你所说的,那么解决方案很简单:检测所有重叠的矩形(在本网站的许多地方和在线其他地方都有可用的解决方案),并将它们从矩形列表中删除。如果要删除与先前矩形重叠的任何矩形,请在创建每个新矩形时执行检测——不要添加新矩形。如果您有其他解决方案,请发布该描述和您的编码尝试。
-
请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。您发布的代码有许多未定义的符号并且没有输出:您没有正确格式化图像。
-
查看用于查找轮廓的阈值图像。也许你可以把它清理一下,这可能会解决你的问题。
-
谢谢@Prune 我现在已经发布了我的完整代码,您只需将随机图像添加到其中,然后您就可以重现问题
标签: python python-3.x opencv rectangles drawrectangle