Question

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

Was it helpful?

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

OTHER TIPS

Assuming that you have pixel information you could draw a convex hull around the white text. Once that you have the hull, you can get the lowest and highest x and y coordinate and use those as your rectangle coordinates so that you could crop the rest of the image.

An example of how to obtain a convex hull in Open_CV (C++) is available here.

It might be a good idea to apply some filter on the image (maybe use the erosion filter) so that you can remove any false positives.

Take projection of white pixels in x-direction and y-direction. The lowest and highest values in x and y direction are bound of your rectangle's y and x co-ordinates respectively. This solution is for simple situations with low processing and in-place calculation.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top