Fill the outside of contours OpenCV

前端 未结 1 778
孤街浪徒
孤街浪徒 2020-12-11 17:07

I am trying to color in black the outside region of a contours using openCV and python language. Here is my code :

contours, hierarchy = cv2.findContours(cop         


        
相关标签:
1条回答
  • 2020-12-11 17:14

    Here's how you can fill an image with black color outside of a set of contours:

    import cv2
    import numpy
    img = cv2.imread("zebra.jpg")
    stencil = numpy.zeros(img.shape).astype(img.dtype)
    contours = [numpy.array([[100, 180], [200, 280], [200, 180]]), numpy.array([[280, 70], [12, 20], [80, 150]])]
    color = [255, 255, 255]
    cv2.fillPoly(stencil, contours, color)
    result = cv2.bitwise_and(img, stencil)
    cv2.imwrite("result.jpg", result)
    

    UPD.: The code above exploits the fact that bitwise_and with 0-s produces 0-s, and won't work for fill colors other than black. To fill with an arbitrary color:

    import cv2
    import numpy
    
    img = cv2.imread("zebra.jpg")
    
    fill_color = [127, 256, 32] # any BGR color value to fill with
    mask_value = 255            # 1 channel white (can be any non-zero uint8 value)
    
    # contours to fill outside of
    contours = [ numpy.array([ [100, 180], [200, 280], [200, 180] ]), 
                 numpy.array([ [280, 70], [12, 20], [80, 150]])
               ]
    
    # our stencil - some `mask_value` contours on black (zeros) background, 
    # the image has same height and width as `img`, but only 1 color channel
    stencil  = numpy.zeros(img.shape[:-1]).astype(numpy.uint8)
    cv2.fillPoly(stencil, contours, mask_value)
    
    sel      = stencil != mask_value # select everything that is not mask_value
    img[sel] = fill_color            # and fill it with fill_color
    
    cv2.imwrite("result.jpg", img)
    

    Can fill with another image as well, for example, using img[sel] = ~img[sel] instead of img[sel] = fill_color would fill it with the same inverted image outside of the contours:

    0 讨论(0)
提交回复
热议问题