OpenCV : Remove background of an image

后端 未结 1 1568
被撕碎了的回忆
被撕碎了的回忆 2021-01-06 18:44

I am using Opencv and python to detect shapes and then crop them. I have succeeded to do that, however now I am trying to take the cropped images and remove their backgroun

相关标签:
1条回答
  • 2021-01-06 19:34

    At least in for this image, there is no need to detect the circle use houghCircle). I think threshold it and find the inner contour , then make mask and do bitwise-op is OK!

    My steps:

    (1) Read and convert to gray

    (2) findContours

    (3) find contour that smaller, create a mask

    (4) do bitwise_and to crop


    Here is my result:


    #!/usr/bin/python3
    # 2018.01.20 20:58:12 CST
    # 2018.01.20 21:24:29 CST
    import cv2
    import numpy as np
    
    ## (1) Read
    img = cv2.imread("img04.png")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ## (2) Threshold
    th, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
    
    ## (3) Find the min-area contour
    _cnts = cv2.findContours(threshed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]
    cnts = sorted(cnts, key=cv2.contourArea)
    for cnt in cnts:
        if cv2.contourArea(cnt) > 100:
            break
    
    ## (4) Create mask and do bitwise-op
    mask = np.zeros(img.shape[:2],np.uint8)
    cv2.drawContours(mask, [cnt],-1, 255, -1)
    dst = cv2.bitwise_and(img, img, mask=mask)
    
    ## Save it
    cv2.imwrite("dst.png", dst)
    
    0 讨论(0)
提交回复
热议问题