2017-07-10 17 views
15

Tôi có một vài nghìn tệp PDF chứa B & hình ảnh W (1bit) từ các dạng giấy được số hóa. Tôi đang cố gắng để OCR một số lĩnh vực, nhưng đôi khi chữ viết này là quá mờ nhạt:Xử lý trước các chữ số viết tay bị quét kém

enter image description here

Tôi vừa mới biết về biến đổi hình thái. Họ thực sự tuyệt vời !!! Tôi cảm thấy như tôi đang lạm dụng chúng (như tôi đã làm với các biểu thức thông thường khi tôi học Perl).

Tôi chỉ quan tâm đến ngày, 2017/07/06:

im = cv2.blur(im, (5, 5)) 
plt.imshow(im, 'gray') 

enter image description here

ret, thresh = cv2.threshold(im, 250, 255, 0) 
plt.imshow(~thresh, 'gray') 

enter image description here

dân điền vào mẫu đơn này dường như có một số coi thường cho lưới điện, vì vậy tôi đã cố gắng để loại bỏ nó. Tôi có thể cô lập các đường ngang với biến đổi này:

horizontal = cv2.morphologyEx(
    ~thresh, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (100, 1)), 
) 
plt.imshow(horizontal, 'gray') 

enter image description here

Tôi có thể lấy đường dọc cũng như:

plt.imshow(horizontal^~thresh, 'gray') 

ret, thresh2 = cv2.threshold(roi, 127, 255, 0) 
vertical = cv2.morphologyEx(
    ~thresh2, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (2, 15)), 
    iterations=2 
) 
vertical = cv2.morphologyEx(
    ~vertical, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9)) 
) 
horizontal = cv2.morphologyEx(
    ~horizontal, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) 
) 
plt.imshow(vertical & horizontal, 'gray') 

enter image description here

Bây giờ tôi có thể nhận được loại bỏ lưới:

plt.imshow(horizontal & vertical & ~thresh, 'gray') 

enter image description here

Điều tốt nhất tôi nhận được điều này, nhưng 4 vẫn chia thành 2 phần:

plt.imshow(cv2.morphologyEx(im2, cv2.MORPH_CLOSE, 
    cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))), 'gray') 

enter image description here

Có lẽ vào thời điểm này nó là tốt hơn để sử dụng cv2.findContours và một số dựa trên kinh nghiệm để xác định từng chữ số, nhưng tôi đã tự hỏi:

  1. tôi nên cung cấp lên và yêu cầu tất cả các tài liệu được quét lại trong thang độ xám?
  2. có phương pháp nào tốt hơn để cô lập và định vị các chữ số mờ không?
  3. bạn có biết bất kỳ biến đổi hình thái nào để tham gia các trường hợp như "4" không?

[cập nhật]

là rescanning các tài liệu quá đòi hỏi? Nếu nó là không gặp khó khăn lớn tôi tin rằng nó là tốt hơn để có được đầu vào chất lượng cao hơn so với đào tạo và cố gắng để hoàn thiện mô hình của bạn để chịu được ồn ào và không điển hình dữ liệu

Một chút bối cảnh: tôi là một ai làm việc tại một cơ quan công ở Brazil. Giá cho các giải pháp ICR bắt đầu trong 6 chữ số vì vậy không ai tin rằng một anh chàng duy nhất có thể viết một giải pháp ICR trong nhà.Tôi đủ ngây thơ để tin rằng tôi có thể chứng minh họ sai. Những tài liệu PDF này đang ngồi ở một máy chủ FTP (khoảng 100 nghìn tệp) và được quét chỉ để loại bỏ phiên bản cây chết. Có lẽ tôi có thể lấy mẫu ban đầu và quét lại bản thân mình nhưng tôi sẽ phải yêu cầu một số hỗ trợ chính thức - vì đây là khu vực công cộng tôi muốn giữ cho dự án này ngầm càng nhiều càng tốt. Những gì tôi có bây giờ là một tỷ lệ lỗi 50%, nhưng nếu phương pháp này là một kết thúc chết không có điểm cố gắng để cải thiện nó.

+1

Đang quét lại tài liệu quá đòi hỏi? Nếu đó không phải là rắc rối lớn, tôi tin rằng tốt hơn là nên có đầu vào chất lượng cao hơn đào tạo và cố gắng tinh chỉnh mô hình của bạn để chịu được dữ liệu ồn ào và không điển hình – DarkCygnus

+0

@GrayCygnus: Tôi sẽ phải vượt qua đại dương quan liêu và quán tính, nhưng có thể . Tôi có lẽ sẽ phải tự làm tất cả công việc thủ công. –

+0

Tôi cũng khuyên bạn nên xem [hướng dẫn] này (http://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/) (từ cùng một nguồn với tài nguyên tôi đã liên kết trên câu trả lời của tôi cho câu hỏi trước của bạn), nơi họ giới thiệu Tesseract (một trình bao bọc của Googles OCR Engine) như một công cụ tuyệt vời để thực hiện OCR. Ngoài ra, tôi tìm thấy [bài báo này] (http://worldcomp-proceedings.com/proc/p2016/ICA3674.pdf) giải thích cách cải thiện nhận dạng ký tự bằng cách sử dụng các hàng xóm gần nhất với chỉ số khoảng cách euclide. Chúc may mắn đi qua đại dương đó :) – DarkCygnus

Trả lời

7

Có thể với Active contour model của một số loại? Ví dụ, tôi thấy thư viện này: https://github.com/pmneila/morphsnakes

Đã thức "4" số điện thoại:

enter image description here

Sau một vài tinh chỉnh nhanh (mà không thực sự hiểu rõ các thông số, vì vậy nó có thể có thể để có được một kết quả tốt hơn) tôi nhận điều này:

enter image description here

với đoạn mã sau (tôi cũng bị hack vào morphsnakes.py một chút t o lưu hình ảnh):

import morphsnakes 

import numpy as np 
from scipy.misc import imread 
from matplotlib import pyplot as ppl 

def circle_levelset(shape, center, sqradius, scalerow=1.0): 
    """Build a binary function with a circle as the 0.5-levelset.""" 
    grid = np.mgrid[list(map(slice, shape))].T - center 
    phi = sqradius - np.sqrt(np.sum((grid.T)**2, 0)) 
    u = np.float_(phi > 0) 
    return u 

#img = imread("testimages/mama07ORI.bmp")[...,0]/255.0 
img = imread("four.png")[...,0]/255.0 

# g(I) 
gI = morphsnakes.gborders(img, alpha=900, sigma=3.5) 

# Morphological GAC. Initialization of the level-set. 
mgac = morphsnakes.MorphGAC(gI, smoothing=1, threshold=0.29, balloon=-1) 
mgac.levelset = circle_levelset(img.shape, (39, 39), 39) 

# Visual evolution. 
ppl.figure() 
morphsnakes.evolve_visual(mgac, num_iters=50, background=img) 
Các vấn đề liên quan