Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert an image into character segments?

Often in the process of OCR, an image file is essentially cut into segments, and each character is recgnised as a segment each. For instance, Unsegmented text as image

has to be transformed to something like Image in which text has been segmented and is ready for OCR

Also, is there any algorithm for Asian languages like Telugu readily available for this purpose? If not, how is this done for English?

like image 374
tuxnani Avatar asked Jun 09 '12 20:06

tuxnani


1 Answers

It can be easily done using OpenCV. Below is a sample code:

import cv2
import numpy as np

# Load the image
img = cv2.imread('sof.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# smooth the image to avoid noises
gray = cv2.medianBlur(gray,5)

# Apply adaptive threshold
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
thresh_color = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)

# apply some dilation and erosion to join the gaps
thresh = cv2.dilate(thresh,None,iterations = 3)
thresh = cv2.erode(thresh,None,iterations = 2)

# Find the contours
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

# For each contour, find the bounding rectangle and draw it
for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.rectangle(thresh_color,(x,y),(x+w,y+h),(0,255,0),2)

# Finally show the image
cv2.imshow('img',img)
cv2.imshow('res',thresh_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

Output will look like below:

enter image description hereenter image description here

like image 179
Abid Rahman K Avatar answered Sep 19 '22 08:09

Abid Rahman K