【问题标题】:Opencv, how to overcrop an image?Opencv,如何过度裁剪图像?
【发布时间】:2019-04-17 17:30:04
【问题描述】:

我有一组任意图像。一半的图像是图片,一半是定义 ROIS 的掩码。

在我的程序的当前版本中,我使用 ROI 来裁剪图像(即,我在图像中提取与 ROI 蒙版的边界框匹配的矩形)。问题是,ROI 掩码并不完美,在我的情况下,过度预测比预测不足要好。

所以我想复制的不仅仅是 ROI 矩形,但如果我这样做,我可能会尝试裁剪图像。

即:

 x, y, w, h = cv2.boundingRect(mask_contour)
 img = img[int(y-h*0.05):int(y + h * 1.05), int(x-w*0.05):int(x + w * 1.05)]

可能会失败,因为它试图访问越界像素。我可以钳制这些值,但我想知道是否有更好的方法

【问题讨论】:

    标签: python image opencv computer-vision


    【解决方案1】:

    您可以添加boarder using OpenCV

    import cv2 as cv
    import random
    src = cv.imread('/home/stephen/lenna.png')
    borderType = cv.BORDER_REPLICATE
    boarderSize = .5
    top = int(boarderSize * src.shape[0])  # shape[0] = rows
    bottom = top
    left = int(boarderSize * src.shape[1])  # shape[1] = cols
    right = left    
    value = [random.randint(0,255), random.randint(0,255), random.randint(0,255)]
    dst = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)
    cv.imshow('img', dst)
    c = cv.waitKey(0)
    

    【讨论】:

      【解决方案2】:

      也许您可以尝试事先限制坐标。请看下面的代码:

      [ymin, ymax] = [max(0,int(y-h*0.05)), min(h, int(y+h*1.05))]
      [xmin, xmax] = [max(0,int(x-w*1.05)), min(w, int(x+w*1.05))]
      img = img[ymin:ymax, xmin:xmax]
      

      【讨论】:

        猜你喜欢
        • 2012-12-31
        • 1970-01-01
        • 2017-08-04
        • 2023-03-05
        • 2019-08-02
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多