Search code examples
c++opencvcrop

Crop text out of binary image OpenCV C++


How can I crop the image so that only the text is included in the image using OpenCV? enter image description here


Solution

  • Approach

    1. Dilating the image in in the vertical and horizontal direction
    2. Finding the bounding rectangle
    3. Cropping the image

    Code

    # reading the input image in grayscale image
    image = cv2.imread('image2.png',cv2.IMREAD_GRAYSCALE)
    image /= 255
    if image is None:
        print 'Can not find/read the image data'
    # Defining ver and hor kernel
    N = 5
    kernel = np.zeros((N,N), dtype=np.uint8)
    kernel[2,:] = 1
    dilated_image = cv2.dilate(image, kernel, iterations=2)
    
    kernel = np.zeros((N,N), dtype=np.uint8)
    kernel[:,2] = 1
    dilated_image = cv2.dilate(dilated_image, kernel, iterations=2)
    image *= 255
    
    # finding contours in the dilated image
    contours,a = cv2.findContours(dilated_image,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # finding bounding rectangle using contours data points
    rect = cv2.boundingRect(contours[0])
    pt1 = (rect[0],rect[1])
    pt2 = (rect[0]+rect[2],rect[1]+rect[3])
    cv2.rectangle(image,pt1,pt2,(100,100,100),thickness=2)
    
    # extracting the rectangle
    text = image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
    
    plt.subplot(1,2,1), plt.imshow(image,'gray')
    plt.subplot(1,2,2), plt.imshow(text,'gray')
    
    plt.show()
    

    Output

    Figure1-Dilated Image

    Figure2-Bounding Rect

    Figure3-Cropped Image