Python 如何丢弃图像中的重叠矩形?

Python 如何丢弃图像中的重叠矩形?,python,opencv,computer-vision,Python,Opencv,Computer Vision,我使用openCV库来检测图像的对象(图1),如下所示 为此,我编写了以下代码: import matplotlib.pyplot as plt import cv2 # source data img_file= "Fig1.jpg" # create an OpenCV image img= cv2.imread(img_file) # convert color image to grey image gray_img=cv2.cvtColor(img,cv2.

我使用
openCV
库来检测图像的对象(图1),如下所示

为此,我编写了以下代码:

import matplotlib.pyplot as plt
import cv2 

# source data
img_file= "Fig1.jpg"

# create an OpenCV image
img= cv2.imread(img_file)

# convert color image to grey image
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

im_gauss = cv2.GaussianBlur(gray_img, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

margin = 40
# calculate area and filter 
for con in contours:
    area = cv2.contourArea(con)
    if 100 < area < 500:
        x,y,w,h = cv2.boundingRect(con)
        cv2.rectangle(img, (x-margin, y-margin), (x + w+margin, y + h+margin), (0,255,0), 2)
        
plt.imshow(img, cmap='gray')
导入matplotlib.pyplot作为plt
进口cv2
#源数据
img_file=“Fig1.jpg”
#创建OpenCV图像
img=cv2.imread(img_文件)
#将彩色图像转换为灰色图像
灰色\u img=cv2.CVT颜色(img,cv2.COLOR\u bgr2灰色)
im_gauss=cv2.GaussianBlur(gray_img,(5,5,0)
ret,thresh=cv2。阈值(im_gauss,127255,0)
#获得轮廓
轮廓,层次=cv2.findContours(阈值,cv2.RETR\u树,cv2.CHAIN\u近似值\u简单)
保证金=40
#计算面积并过滤
对于轮廓中的con:
面积=cv2。轮廓面积(con)
如果100<面积<500:
x、 y,w,h=cv2.boundingRect(con)
cv2.矩形(img,(x边距,y边距),(x+w+边距,y+h+边距),(0255,0),2)
plt.imshow(img,cmap='gray')
这些代码将能够为您提供带有检测到的对象的图像,请参见下图


现在你可以看到,在检测物体时,一些矩形是重叠的。这不是预期的结果。我想要一个图形,它丢弃所有重叠的矩形,并附带另一个图形,只包括那些不重叠的矩形。你知道怎么做吗?提前感谢。

假设每个矩形都有
x
y
、宽度和高度,则需要对每两个矩形进行成对比较,通过比较

  • 矩形#1的
    x
    介于
    x
    x
    +矩形#2的宽度之间,或
  • 矩形#1的
    y
    介于
    y
    y
    +矩形#2的高度之间,或
幸运的是,您可以使用NumPy的矢量化功能来避免嵌套循环

在下面的代码中,我生成了一些随机矩形,并过滤掉那些重叠的矩形:

导入cv2
将numpy作为np导入
#在黑色背景上随机生成n个白色矩形
n=20
rects=[[np.random.randint(0350),
np.random.randint(0250),
np.random.randint(10,50),
范围(n)内i的np.random.randint(10,50)]
img=np.zero((300400),np.uint8)
对于矩形中的矩形:
img=cv2.矩形(img,(rect[0],rect[1]),
(rect[0]+rect[2],rect[1]+rect[3]),255,1)
#计算左、右、上、下极限
rects=np.数组(rects)
左=np。展开尺寸(矩形[:,0],轴=1)
右=np。展开(矩形[:,0]+矩形[:,2],轴=1)
顶部=np。展开尺寸(矩形[:,1],轴=1)
底部=np。展开尺寸(矩形[:,1]+矩形[:,3],轴=1)
#检查左极限侵入、右极限侵入。。。

复选框=(左图)您可能想发布一个结果图像,希望输出看起来像。您不太清楚如何清除ROI。谢谢您的评论。我想要一个排除所有重叠矩形的图形。因此,基本上所有这些都是误报,没有任何ROI?在这种情况下,您需要@HansHirse的解决方案需要。我添加了原始图形,还添加了一个显示矩形坐标的excel文件。标签:MN表示红色矩形坐标,其余表示绿色矩形坐标。您能告诉我如何使用您的代码使用此信息获得所需的结果吗?不知怎的,我没有上传excel文件的选项这里。不过,我在excel文件中的所有矩形都有x、y、width和height。所以基本上,我必须使用ur代码,从检查左限制侵入、右限制侵入开始?不,您需要从
;计算左、右、上、下限制
,因为计算的是
right
bottom
x
y
,宽度和高度。对于给定的图像,我很难实现此代码。比方说,如果您将此图像作为输入,那么我如何使用您的代码。对于我的图像,“rects”是什么?