2010-03-10 33 views
38

Gần đây tôi đã thấy một người có áo phông có mã Perl ở mặt sau. Tôi lấy một bức ảnh của nó và cắt ra các mã:Trích xuất mã từ ảnh chụp áo phông qua OCR

alt text

Tiếp theo, tôi cố gắng trích xuất mã từ hình ảnh thông qua OCR, vì vậy tôi cài đặt bindings Tesseract OCR và Python cho nó, pytesser.

Pytesser chỉ hoạt động trên hình ảnh TIFF, vì vậy tôi chuyển đổi hình ảnh trong Gimp và nhập đoạn mã sau (Ubuntu 9.10):

>>> from pytesser import * 
>>> image = Image.open('code.tif') 
>>> print image_to_string(image) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pytesser.py", line 30, in image_to_string 
    util.image_to_scratch(im, scratch_image_name) 
    File "util.py", line 7, in image_to_scratch 
    im.save(scratch_image_name, dpi=(200,200)) 
    File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1406, in save 
    save_handler(self, fp, filename) 
    File "/usr/lib/python2.6/dist-packages/PIL/BmpImagePlugin.py", line 197, in _save 
    raise IOError("cannot write mode %s as BMP" % im.mode) 
IOError: cannot write mode RGBA as BMP 
>>> r,g,b,a = image.split() 
>>> img = Image.merge("RGB", (r,g,b)) 
>>> print image_to_string(img) 
Tesseract Open Source OCR Engine 

    éi  _ l_` _ t 
    ’ ‘" fY` 
    { W  IKQW 
    · __·_ ‘ ·-»·  
     :W Z 
    ·· I A n 1 
      ;f   
    ` `  
`T  .' V _ ‘ 
I {Z.; » ;,. , ; y i- 4 : %:,,  
     `· » V; ` ?  
‘,—·.  
H***li¥v·•·}I§¢ ` _ »¢is5#__·¤G$++}§;“»‘7· 
    71 ’ Q { NH IQ 
    ytéggygi {  ;g¤qg;gm·;,g(g,,3) {3;;+- 
    § {Jf**$d$ }‘$p•¢L#d¤ Sc} 
    » i ` i A1: 

Đó là GIBBERISH rõ rằng đi ra của động cơ OCR. Vì vậy, câu hỏi của tôi là:

  • Tôi phải làm gì để có được kết quả OCR tốt hơn trong Tesseract?
  • Hoặc, có ai khác có may mắn hơn khi trích xuất mã từ hình ảnh trên theo một cách khác không?
+40

Tôi nghĩ rằng thực sự * là * hợp lệ perl ... – PaulMcG

+3

bạn chỉ có thể nhập lại. điều đó chắc chắn sẽ nhanh hơn, vì nó có vẻ là một dự án. – SilentGhost

+4

c'mon im lặng, điều này trông giống như vui vẻ (và những người hiểu biết đó là một off hay không?) – KevinDTimm

Trả lời

38

Bạn có lẽ có thể gõ nhanh hơn bạn có thể dọn dẹp các hình ảnh và cài đặt cơ OCR:

#!/usr/bin/perl 
(my$d=q[AA    GTCAGTTCCT 
    CGCTATGTA     ACACACACCA 
    TTTGTGAGT    ATGTAACATA 
     CTCGCTGGC    TATGTCAGAC 
     AGATTGATC   GATCGATAGA 
      ATGATAGATC  GAACGAGTGA 
      TAGATAGAGT GATAGATAGA 
       GAGAGA GATAGAACGA 
       TC GATAGAGAGA 
       TAGATAGACA G 
       ATCGAGAGAC AGATA 
      GAACGACAGA TAGATAGAT 
      TGAGTGATAG ACTGAGAGAT 
     AGATAGATTG  ATAGATAGAT 
     AGATAGATAG   ACTGATAGAT 
    AGAGTGATAG    ATAGAATGAG 
    AGATAGACAG    ACAGACAGAT 
    AGATAGACAG    AGAGACAGAT 
    TGATAGATAG    ATAGATAGAT 
    TGATAGATAG   AATGATAGAT 
    AGATTGAGTG  ACAGATCGAT 
    AGAACCTTTCT CAGTAACAGT 
     CTTTCTCGC TGGCTTGCTT 
     TCTAA CAACCTTACT 
      G ACTGCCTTTC 
      TGAGATAGAT CGA 
     TAGATAGATA GACAGAC 
     AGATAGATAG ATAGAATGAC 
    AGACAGAGAG  ACAGAATGAT 
    CGAGAGACAG   ATAGATAGAT 
    AGAATGATAG    ACAGATAGAC 
    AGATAGATAG    ACAGACAGAT 
    AGACAGACTG     ATAGATAGAT 
    AGATAGATAG     AATGACAGAT 
    CGATTGAATG    ACAGATAGAT 
     CGACAGATAG    ATAGACAGAT 
     AGAGTGATAG   ATTGATCGAC 
      TGATTGATAG  ACTGATTGAT 
      AGACAGATAG AGTGACAGAT 
       CGACAGA TAGATAGATA 
       GATA GATAGATAG 
        ATAGACAGA G 
        AGATAGATAG ACA 
       GTCGCAAGTTC GCTCACA 
])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67, 
71;$p=join$;,keys%a;while($d=~/([$p]{4})/g 
){next if$j++%96>=16;$c=0;for$d(0..3){$c+= 
$a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c} 
      eval $perl; 

Edit: typo.

+4

+1 nhưng bạn đã có vòng A và G sai vòng lol –

+1

+1 cho nỗ lực! : D – kikito

+1

Bây giờ nó hoạt động. Sweet :) – BioGeek

5

Hmm có lẽ bạn cần phải xử lý hình ảnh, tức là đặt nó mặc dù một số bộ lọc như 'phát hiện cạnh', chạm nổi/khắc hoặc một bộ lọc tiếng ồn ...

+0

... hoặc tốt hơn, có được một động cơ REAL OCR làm điều đó cho bạn. –

+4

nó chỉ là một gợi ý như thế nào bạn có thể nhận được kết quả tốt hơn từ 'Tesseract' ... Tôi đoán trong một thế giới lý tưởng một động cơ REAL OCR làm việc hoàn hảo mọi lúc sẽ làm các trick ... @ Otavio nếu gona của bạn làm cho một bình luận như vậy ít nhất là đề nghị một động cơ REAL OCR ... :) –

+3

Sau đó, hai người tốt - Abbyy và Oce '. –

5

OCRs Tốt được hướng dẫn mạnh mẽ bởi sự dư thừa trong tự nhiên ngôn ngữ để mang lại một tập hợp con cho "những gì có thể là nhân vật tiếp theo". Mã Perl không hỗ trợ cho OCR. Gõ vào bằng tay.

+0

Tôi đoán rằng nó thực hiện một số phiên mã. ví dụ. http://www.techcuriosity.com/resources/bioinformatics/dna2rna.php – msw

+0

Perl thực sự có nhiều ràng buộc cụ thể hơn - phân tích rõ ràng và chạy một cách hợp lý. Và các helen DNA chỉ sử dụng 4 ký tự và một ký tự trống. Vì vậy, điều này là khá dễ dàng, được tích hợp trình phân tích cú pháp đúng. – nealmcb

7

Nếu tôi là bạn, tôi bắt đầu bằng cách làm sạch hình ảnh càng nhiều càng tốt, sử dụng chương trình thao tác hình ảnh (ví dụ như GIMP) để đầu vào cho OCR dễ hiểu hơn.

Nếu có thể, hãy đặt mục tiêu tạo hình ảnh chỉ đen trắng.

15

quá trình xử lý trước chắc chắn sẽ mang lại hình ảnh khả thi hơn.

Ví dụ: dưới đây là kết quả của bộ lọc "Cấp", "Sự khác biệt của Gaussians" và "Cấp độ" trên hình ảnh.

pre processed image

+0

Liên kết tới hình ảnh của bạn không hoạt động. – BioGeek

+0

Hy vọng được sửa chữa. –

+0

Bây giờ nó hiển thị. Cảm ơn. – BioGeek

8

Chỉ cần một vài lỗi chính tả trong mã RedDwight.

#!/usr/bin/perl 
(my $d=q[AA    GTCAGTTCCT 
    CGCTATGTA     ACACACACCA 
    TTTGTGAGT    ATGTAACATA 
     CTCGCTGGC    TATGTCAGAC 
     AGATTGATC   GATCGATAGA 
      ATGATAGATC  GAACGAGTGA 
      TAGATAGAGT GATAGATAGA 
       GAGAGA GATAGAACGA 
       TC GATAGAGAGA 
       TAGATAGACA G 
       ATCGAGAGAC AGATA 
      GAACGACAGA TAGATAGAT 
      TGAGTGATAG ACTGAGAGAT 
     AGATAGATTG  ATAGATAGAT 
     AGATAGATAG   ACTGATAGAT 
    AGAGTGATAG    ATAGAATGAG 
    AGATAGACAG    ACAGACAGAT 
    AGATAGACAG    AGAGACAGAT 
    TGATAGATAG    ATAGATAGAT 
    TGATAGATAG   AATGATAGAT 
    AGATTGAGTG  ACAGATCGAT 
    AGAACCTTTCT CAGTAACAGT 
     CTTTCTCGC TGGCTTGCTT 
     TCTAA CAACCTTACT 
      G ACTGCCTTTC 
      TGAGATAGAT CGA 
     TAGATAGATA GACAGAC 
     AGATAGATAG ATAGAATGAC 
    AGACAGAGAG  ACAGAATGAT 
    CGAGAGACAG   ATAGATAGAT 
    AGAATGATAG    ACAGATAGAC 
    AGATAGATAG    ACAGACAGAT 
    AGACAGACTG     ATAGATAGAT 
    AGATAGATAG     AATGACAGAT 
    CGATTGAATG    ACAGATAGAT 
     CGACAGATAG    ATAGACAGAT 
     AGAGTGATAG   ATTGATCGAC 
      TGATTGATAG  ACTGATTGAT 
      AGACAGATAG AGTGACAGAT 
       CGACAGA TAGATAGATA 
       GATA GATAGATAG 
        ATAGACAGA G 
        AGATAGATAG ACA 
       GTCGCAAGTTC GCTCACA 
])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67, 
71;$p=join$;,keys%a;while($d=~/([$p]{4})/g 
){next if$j++%96>=16;$c=0;for$d(0..3){$c+= 
$a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c} 
      eval $perl; 

rằng khi thực hiện sản xuất:

Just another genome hacker. 
0

Chìa khóa cho một nhiệm vụ như thế này là để tận dụng lợi thế của những hạn chế rõ rệt. Tìm thư viện cho phép bạn chỉ định bộ ký tự của riêng bạn. Yêu cầu tất cả các ký tự trong các helen DNA chính là một trong A T G C. Yêu cầu toàn bộ phân tích cú pháp là perl. Gõ vào các bộ phận cứng bằng tay nếu cần.

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