Python 如何从具有许多不同前景的图像中提取任意背景矩形面片

Python 如何从具有许多不同前景的图像中提取任意背景矩形面片,python,opencv,image-processing,computer-vision,dataset,Python,Opencv,Image Processing,Computer Vision,Dataset,我正在研究如何从同一幅图像中提取人脸和相同数量的背景 我能够(从注释的坐标)获得面 我的问题是: 我想裁剪具有相同数量面(不一定相同大小)的地面面片, 对背景的限制是: 任何背景图像的大小应不小于20 x 20像素 与面(其中任何一个面)的最大重叠率(IOU:联合体上的交点)不应超过20%(0.2) 背景面片的计数应与同一图像中的面计数相同 示例图像: 注释数据: [Rmax RminθXc Yc] [[ 52 38 1 154 72] [ 57 38 -2 368 1

我正在研究如何从同一幅图像中提取人脸和相同数量的背景

  • 我能够(从注释的坐标)获得面

  • 我的问题是: 我想裁剪具有相同数量面(不一定相同大小)的地面面片, 对背景的限制是:

  • 任何背景图像的大小应不小于20 x 20像素
  • 与面(其中任何一个面)的最大重叠率(IOU:联合体上的交点)不应超过20%(0.2)
  • 背景面片的计数应与同一图像中的面计数相同
  • 示例图像:

    注释数据:

    [Rmax RminθXc Yc]

    [[ 52  38   1 154  72]
     [ 57  38  -2 368 103]
     [ 14   9  -2  11  64]
     [ 11   8   1  29  16]
     [ 10   6   1  56  61]
     [ 10   6  -2  68  66]
     [ 14   9   1  46 126]
     [ 15  11   1  21 192]
     [ 22  12   1  11 157]
     [ 13   9   1 267 133]
     [ 19  13   1 312 186]
     [ 12   9   1 300  19]
     [ 11   9  -2 334 139]
     [ 14  10  -2 437  87]
     [ 11   8   1 232  27]]
    
    我的代码是:

    #--------------------
    #进口图书馆
    #====================
    将numpy作为np导入
    将matplotlib.pyplot作为plt导入
    导入操作系统
    进口cv2
    datasetPath=“/home/myPath”
    #---------------------------------------------
    #从图像中提取人脸和背景
    #=============================================
    def extData(imgPath、annots、foldPath、index):
    '''
    函数从图像中提取人脸和背景。
    参数:
    @Param:imgPath:指定的映像路径(在数据库中)。
    @Param:annots:nd数组,形状为m x 5,:m图像中检测到的面数。
    (5) :最大半径|最小半径|角度|中心x |中心y
    @Param:foldPath:保存提取图像的折叠路径。
    @Param:index:一个开始命名面和背景的数字。
    在foldPath中保存:m nd数组(m个面)和m nd数组(m个背景)
    '''
    fullImagePath=os.path.join(datasetPath,imgPath)
    img=cv2.imread(完整图像路径)
    img=cv2.cvt颜色(img,cv2.COLOR\u BGR2RGB)
    #创建面
    facesList=[]
    对于范围内的行(注释形状[0]):
    #初始化变量
    xc=注释[行][3]
    yc=注释[行][4]
    Rmax=注释[行][0]
    Rmin=注释[行][1]
    θ=注释[行][2]
    #矩形边框
    #表示矩形的左上角
    x0=数学楼层(xc-Rmin*math.sin(θ))
    y0=数学地板(yc-Rmax*math.sin(θ))
    #表示矩形的右下角
    x1=数学地板(xc+Rmin*数学sin(θ))
    y1=数学地板(yc+Rmax*数学sin(θ))
    #在矩形窗口中裁剪面
    面=img[y0:y1,x0:x1,:]
    #存储面的坐标
    facesList.append([x0,x1,y0,y1])
    #制作一个目录来保存里面的面。
    mkdir(os.path.join(foldPath,“/face/”)
    imwrite(os.path.join(foldPath,“/face/”,“face”{}.format(str(index+row)),face))
    #创造背景
    对于行,枚举中的面(面列表):
    #背景=img[xb1:xb2,yb1:yb2,:]
    #制作一个目录来保存里面的背景。
    mkdir(os.path.join(foldPath,“/background/”)
    #imwrite(os.path.join(foldPath,“/background/”,“background”{}.format(str(index+row)),background))
    #---------------------------------------------
    
    您可以使用来计算与面之间的L1距离,并根据距离对矩形中心进行采样,从而确保裁剪不会与“面”重叠:

    将numpy导入为np
    img=cv2.imread(完整图像路径)
    #在“面”和bonudary中创建一个带零的遮罩
    掩码=np.zero(img.shape[:2],dtype=np.uint8)
    掩码[1:-1,1:-1]=1
    对于范围内的行(注释形状[0]):
    #初始化变量
    xc=注释[行][3]
    yc=注释[行][4]
    Rmax=注释[行][0]
    Rmin=注释[行][1]
    θ=注释[行][2]
    #如果旋转角度超过45度,则交换半径
    如果(θ>45):
    R=Rmax
    Rmax=Rmin
    Rmin=R
    #矩形边框
    #表示矩形的左上角
    st=数学sin(θ)
    如果st>0,则st=st,否则-st
    x0=数学楼层(xc-Rmin*st)
    y0=数学楼层(yc-Rmax*st)
    #表示矩形的右下角
    x1=数学楼层(xc+Rmin*st)
    y1=数学楼层(yc+Rmax*st)
    #在矩形窗口中裁剪面
    掩模[y0:y1,x0:x1]=0
    #一旦我们有了一张地图,我们就可以计算每个非人脸像素到最近人脸的距离
    dst=cv2.distanceTransform(掩码,cv2.DistanceL1,3)
    #距离人脸小于10像素(20//2)的像素不能被视为好的候选像素。如果允许IoU>0,则可以稍微放宽。
    dst[dst您可以使用来计算与面之间的L1距离,并根据距离对矩形中心进行采样,从而确保裁剪不会与“面”重叠:

    将numpy导入为np
    img=cv2.imread(完整图像路径)
    #在“面”和bonudary中创建一个带零的遮罩
    掩码=np.zero(img.shape[:2],dtype=np.uint8)
    掩码[1:-1,1:-1]=1
    对于范围内的行(注释形状[0]):
    #初始化变量
    xc=注释[行][3]
    yc=注释[行][4]
    Rmax=注释[行][0]
    Rmin=注释[行][1]
    θ=注释[行][2]
    #如果旋转角度超过45度,则交换半径
    如果(θ>45):
    R=Rmax
    Rmax=Rmin
    Rmin=R
    #矩形边框
    #表示矩形的左上角
    st=数学sin(θ)
    如果st>0,则st=st,否则-st
    x0=数学楼层(xc-Rmin*st)
    y0=数学楼层(yc-Rmax*st)
    #表示矩形的右下角
    x1=数学楼层(xc+Rmin*st)
    y1=数学楼层(yc+Rmax*st)
    #在矩形窗口中裁剪面
    掩模[y0:y1,x0:x1]=0
    #一旦我们有了一张地图,我们就可以计算每个非人脸像素到最近人脸的距离
    dst=cv2.distanceTransform(掩码,cv2.DistanceL1,3)
    #距离人脸小于10像素(20//2)的像素不能被视为好的候选像素。如果允许IoU>0,则可以将其放宽为l