Я пытался распознать рукописные буквы (цифры / алфавит) из формы документа.Как известно, формы-документы имеют ячейки с 1-й строкой, где заявитель должен заполнить свою информацию в этих ограниченных ячейках.Однако я не могу сегментировать цифры (в настоящее время мой ввод состоит только из цифр) из ограничивающих рамок.
Я прошел следующие шаги:
- Чтение изображения (в виде изображения в градациях серого) с помощью «imread» метода opencv2.Исходный размер изображения: 19 x 209 (в пикселях).
pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)
Изменение размера изображения на 200% от его первоначального размера с помощью метода "resize" в opencv2.Я использовал интерполяцию INTER_AREA.Размер изображения: 38 х 418 (в пикселях)
h,w = newImg.shape
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
Прикладное обнаружение краев Канни.
v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)
Обрезать контуры и сохранить их в виде изображений в каталоге 'BB'.
im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
num = 0
for c in contours:
x, y, w, h = cv2.boundingRect(c)
num += 1
new_img = resizedImg[y:y+h, x:x+w]
cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)
Полный код в целом:
pic = "crop/cropped000.jpg"
newImg = cv2.imread(pic, 0)
h,w = newImg.shape
print(newImg.shape)
resizedImg = cv2.resize(newImg, (2*w,2*h), interpolation=cv2.INTER_AREA)
print(resizedImg.shape)
v = np.median(resizedImg)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edgedImg = cv2.Canny(resizedImg, lower, upper)
im2, contours, hierarchy = cv2.findContours(edgedImg.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
num = 0
for c in contours:
x, y, w, h = cv2.boundingRect(c)
num += 1
new_img = resizedImg[y:y+h, x:x+w]
cv2.imwrite('BB/'+str(num).zfill(3) + '.jpg', new_img)
Полученные изображения размещены здесь: https://imgur.com/a/GStIcdj
Мне пришлось удвоить размер изображения, потому что при обнаружении Canny edge объект получился двойным по краям (однако, он все равно это делает).Я также играл с другими функциями openCV, такими как Thresholding, Gaussian Blur, Dlates, Erode, но все было напрасно.