Search code examples
pythonopencvimage-processingcomputer-visionpanoramas

Trim image during Stitching


I am stitching multiple images into one. In an intermediate step, I get an image like:

enter image description here

It isn't necessary at all that the image starts from left and has black region in the right. I want to obtain a rectangular image from this one that doesn't contain the black region. That is, something like:

enter image description here

Can someone please suggest me a way to do that?


Solution

  • Here is one way to crop out the excess black on the right side of the image:

    Read the image
    
    Convert to grayscale
    
    Threshold
    
    Apply closing and opening morphology to remove small black and white spots.
    
    Get the surrounding contour
    
    Crop the contour
    
    Save the result
    


    Input:

    enter image description here

    import cv2
    import numpy as np
    
    # read image
    img = cv2.imread('road.jpg')
    
    # convert to grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # threshold
    _,thresh = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
    
    # apply close and open morphology to fill tiny black and white holes
    kernel = np.ones((5,5), np.uint8)
    thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    
    # get contours (presumably just one around the nonzero pixels) 
    # then crop it to bounding rectangle
    contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours = contours[0] if len(contours) == 2 else contours[1]
    for cntr in contours:
        x,y,w,h = cv2.boundingRect(cntr)
        crop = img[y:y+h,x:x+w]
        # show cropped image
        cv2.imshow("CROP", crop)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # save cropped image
    cv2.imwrite('road_crop.png',crop)
    


    enter image description here