2013-05-16 33 views
9

Tôi đã viết một chương trình bằng Python có thể tự động đọc bảng điểm như thế này một Sheet after deskewingphát hiện mạnh mẽ của mô hình lưới trong một hình ảnh

Tại thời điểm tôi đang sử dụng chiến lược cơ bản sau đây:

  • Deskew hình ảnh bằng cách sử dụng ImageMagick
  • Đọc bằng Python sử dụng PIL, chuyển đổi hình ảnh thành B & W
  • Tính toán tổng các điểm ảnh trong các hàng và cột
  • Tìm các mức cao nhất trong các khoản tiền này
  • Kiểm tra các giao lộ được ngụ ý bởi các đỉnh này để điền.

Kết quả của việc chạy chương trình được thể hiện trong hình ảnh này: Image after processing

Bạn có thể xem lô đỉnh bên dưới và bên phải của hình ảnh hiển thị trong trên bên trái. Các dòng trong hình trên cùng bên trái là vị trí của các cột và các chấm đỏ hiển thị các điểm đã xác định. Biểu đồ góc dưới bên phải cho thấy mức độ lấp đầy của mỗi vòng tròn và đường phân loại.

Sự cố với phương pháp này là yêu cầu điều chỉnh cẩn thận và nhạy cảm với sự khác biệt trong cài đặt quét. Có cách nào mạnh mẽ hơn để nhận diện lưới, điều này sẽ yêu cầu ít thông tin ưu tiên hơn (hiện tại tôi đang sử dụng kiến ​​thức về số lượng dấu chấm có) và mạnh mẽ hơn đối với những người vẽ các hình dạng khác trên trang tính không? Tôi tin rằng nó có thể là có thể bằng cách sử dụng một 2D Fourier Transform, nhưng tôi không chắc chắn như thế nào.

Tôi đang sử dụng EPD, vì vậy tôi có khá nhiều thư viện theo ý của mình.

+1

Bạn có thể thử sử dụng biến đổi Hough cho các vòng kết nối tìm kiếm. Hoặc thậm chí chỉ cần thực hiện một tương quan chéo của hình ảnh được quét với hình ảnh của vòng tròn đơn. Peaks sẽ hiển thị tọa độ của tất cả các vòng tròn, điều chỉnh nhẹ (phương pháp hình vuông trung bình hoặc thậm chí ít nhất) sẽ cung cấp cho bạn lưới tốt. –

+0

liên quan: [Tìm số hình dạng màu từ hình ảnh sử dụng Python] (http://stackoverflow.com/q/5298884/4279) – jfs

Trả lời

2

Cách chính xác để thực hiện việc này là sử dụng phân tích Thành phần được kết nối trên hình ảnh, để phân đoạn thành "đối tượng". Sau đó, bạn có thể sử dụng thuật toán cấp cao hơn (ví dụ: biến đổi hough trên các thành phần centroid) để phát hiện lưới và cũng xác định cho mỗi ô cho dù là bật/tắt, bằng cách xem số lượng pixel hoạt động chứa.

+0

+1. Ngoài ra, tôi đề nghị OP có một cái nhìn tại http://opencv.org/ - nó là tuyệt vời cho xử lý hình ảnh trong Python – misha

+0

Bạn có thể xây dựng trên bằng cách sử dụng biến đổi Hough để tìm một hình dạng lưới? Tôi quen thuộc với việc sử dụng nó để tìm dòng, nhưng tôi chắc chắn rằng thực tế là lưới là một mô hình lặp lại tốt đẹp có thể được khai thác. – chthonicdaemon

+0

nếu bạn nhìn vào vị trí của các thành phần centroids như các điểm dữ liệu bạn nhập vào biến đổi hough (thay vì pixel riêng lẻ), bạn sẽ có được phân tích rất thấp "phân giải thấp" của các dòng được sắp xếp. sự cần thiết phải giảm bớt trước. Một tùy chọn khác là sử dụng Ransac để xác định sự sắp xếp của lưới điện. Khi bạn di chuyển từ cấp độ pixel đến cấp thành phần, mọi thứ trở nên trực quan hơn và về cơ bản bạn có thể đưa ra các giải pháp mạnh mẽ một cách dễ dàng. – Photon

2

Trước hết, tôi thấy phương pháp ban đầu của bạn khá âm thanh và tôi có thể đã thử cùng một cách (tôi đặc biệt đánh giá cao việc chiếu hàng/cột theo sau là biểu đồ, là phương pháp được đánh giá thấp thường khá hiệu quả trong các ứng dụng thực).

Tuy nhiên, kể từ khi bạn muốn đi cho một đường ống xử lý mạnh mẽ hơn, đây là một đề nghị mà có lẽ có thể được hoàn toàn tự động (cũng loại bỏ đồng thời các deskewing qua ImageMagick):

  1. khai thác tính năng: trích xuất các vòng tròn thông qua một biến đổi Hough tổng quát. Như được đề xuất trong các câu trả lời khác, bạn có thể sử dụng trình bao bọc Python của OpenCV cho điều đó. Máy dò có thể bỏ lỡ một số vòng tròn nhưng điều này không quan trọng.
  2. Áp dụng thiết bị dò liên kết mạnh mẽ bằng cách sử dụng các tâm tròn. Bạn có thể sử dụng thiết bị dò ít thông số Desloneux được mô tả here. Đừng sợ bởi toán học, thủ tục khá đơn giản để thực hiện (và bạn có thể tìm thấy các triển khai ví dụ trực tuyến).
  3. Loại bỏ các đường chéo bằng một lựa chọn trên hướng.
  4. Tìm giao điểm của các đường để nhận các dấu chấm. Bạn có thể sử dụng các tọa độ này cho deskewing bằng cách giả định vị trí cố định lý tưởng cho các giao lộ này.

Đường ống này có thể là một chút CPU chuyên sâu (đặc biệt là bước 2 sẽ tiến hành tìm kiếm tham lam), nhưng nó sẽ khá mạnh mẽ và tự động.

Các vấn đề liên quan