2013-02-13 19 views
7

Chciałbym poznać sposób na wyodrębnienie poszczególnych linii miar. Nie jestem pewien, czy algorytm już istnieje, więc pomyślałem o skanowaniu nut od lewej do prawej, wyodrębnij wszystkie białe spacje z góry i poniżej linii miar.Wyciągi na każdej linii z nut

Nie szukam sposobu na konwersję nuty do MusicXML lub wyodrębnienie innych przydatnych informacji. Nie, w zasadzie to, z czym mam do czynienia, to zwykły dokument. Muszę oddzielić akapity. Nie interesują mnie informacje zawarte w paragrafie, ale po prostu dzielą je oddzielnie od regionów dokumentu. W takim przypadku akapit byłby jedną linią środków. Nie potrzebuję indywidualnych miar, ale wszystkie miary na każdej linii nut.

enter image description here

Jest to jeden z wyjściem chciałbym z pełnego arkusza muzyki, ale bez tytułu, kompozytora i itp enter image description here

+1

Czy potrzebujesz również notatek powyżej/poniżej personelu? Czasami te mogą się trochę splątać. – Hannele

+2

Co oznacza "wyodrębnić indywidualną linię miar"? To nie jest muzyczny termin. – EJP

+1

Nie jest to bezpośrednia odpowiedź, ale googleing dla "Python sheet music ocr", zaprowadził mnie do innego pytania na temat stosu :: http://stackoverflow.com/questions/675077/ocr-for-sheet-music :: co może ci pomóc – pyInTheSky

Odpowiedz

4

Przypuśćmy masz nuty w pliku PDF, chciałbym użyj Apache PDFBox, aby uzyskać obrazy z wejściowego pliku PDF zawierającego nutę, a następnie znajdź współrzędne całego paska, którego potrzebujesz, a na wybranym obrazku określ współrzędne, aby przyciąć obraz i manipulować nim, aż uzyskasz pożądany efekt.

PDDocument document = null; 
document = PDDocument.load(inFile); 
List pages = document.getDocumentCatalog().getAllPages(); 
Iterator iter = pages.iterator(); 
while (iter.hasNext()) { 
      PDPage page = (PDPage) iter.next(); 
      PDResources resources = page.getResources(); 
      Map pageImages = resources.getImages(); 
      if (pageImages != null) { 
       Iterator imageIter = pageImages.keySet().iterator(); 
       while (imageIter.hasNext()) { 
        String key = (String) imageIter.next(); 
        PDXObjectImage image = (PDXObjectImage) pageImages.get(key); 
        image.write2OutputStream(/* some output stream */); 
       } 
      } 
} 

Oto przykładowy kod dostępny w Apache PDFBox.

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDResources; 
import org.apache.pdfbox.pdmodel.encryption.AccessPermission; 
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 

/** 
* This will read a read pdf and extract images. <br/><br/> 
* 
* usage: java org.apache.pdfbox.ExtractImages &lt;pdffile&gt; &lt;password&gt; [imageprefix] 
* 
* @author <a href="mailto:[email protected]">Ben Litchfield</a> 
* @version $Revision: 1.7 $ 
*/ 
public class ExtractImages 
{ 
    private int imageCounter = 1; 

    private static final String PASSWORD = "-password"; 
    private static final String PREFIX = "-prefix"; 
    private static final String ADDKEY = "-addkey"; 
    private static final String NONSEQ = "-nonSeq"; 

    private ExtractImages() 
    { 
    } 

    /** 
    * This is the entry point for the application. 
    * 
    * @param args The command-line arguments. 
    * 
    * @throws Exception If there is an error decrypting the document. 
    */ 
    public static void main(String[] args) throws Exception 
    { 
     ExtractImages extractor = new ExtractImages(); 
     extractor.extractImages(args); 
    } 

    private void extractImages(String[] args) throws Exception 
    { 
     if(args.length < 1 || args.length > 4) 
     { 
      usage(); 
     } 
     else 
     { 
      String pdfFile = null; 
      String password = ""; 
      String prefix = null; 
      boolean addKey = false; 
      boolean useNonSeqParser = false; 
      for(int i=0; i<args.length; i++) 
      { 
       if(args[i].equals(PASSWORD)) 
       { 
        i++; 
        if(i >= args.length) 
        { 
         usage(); 
        } 
        password = args[i]; 
       } 
       else if(args[i].equals(PREFIX)) 
       { 
        i++; 
        if(i >= args.length) 
        { 
         usage(); 
        } 
        prefix = args[i]; 
       } 
       else if(args[i].equals(ADDKEY)) 
       { 
        addKey = true; 
       } 
       else if(args[i].equals(NONSEQ)) 
       { 
        useNonSeqParser = true; 
       } 
       else 
       { 
        if(pdfFile == null) 
        { 
         pdfFile = args[i]; 
        } 
       } 
      } 
      if(pdfFile == null) 
      { 
       usage(); 
      } 
      else 
      { 
       if(prefix == null && pdfFile.length() >4) 
       { 
        prefix = pdfFile.substring(0, pdfFile.length() -4); 
       } 

       PDDocument document = null; 

       try 
       { 
        if (useNonSeqParser) 
        { 
         document = PDDocument.loadNonSeq(new File(pdfFile), null, password); 
        } 
        else 
        { 
         document = PDDocument.load(pdfFile); 

         if(document.isEncrypted()) 
         { 
          StandardDecryptionMaterial spm = new StandardDecryptionMaterial(password); 
          document.openProtection(spm); 
         } 
        } 
        AccessPermission ap = document.getCurrentAccessPermission(); 
        if(! ap.canExtractContent()) 
        { 
         throw new IOException(
          "Error: You do not have permission to extract images."); 
        } 

        List pages = document.getDocumentCatalog().getAllPages(); 
        Iterator iter = pages.iterator(); 
        while(iter.hasNext()) 
        { 
         PDPage page = (PDPage)iter.next(); 
         PDResources resources = page.getResources(); 
         // extract all XObjectImages which are part of the page resources 
         processResources(resources, prefix, addKey); 
        } 
       } 
       finally 
       { 
        if(document != null) 
        { 
         document.close(); 
        } 
       } 
      } 
     } 
    } 

    private void processResources(PDResources resources, String prefix, boolean addKey) throws IOException 
    { 
     if (resources == null) 
     { 
      return; 
     } 
     Map<String, PDXObject> xobjects = resources.getXObjects(); 
     if(xobjects != null) 
     { 
      Iterator<String> xobjectIter = xobjects.keySet().iterator(); 
      while(xobjectIter.hasNext()) 
      { 
       String key = xobjectIter.next(); 
       PDXObject xobject = xobjects.get(key); 
       // write the images 
       if (xobject instanceof PDXObjectImage) 
       { 
        PDXObjectImage image = (PDXObjectImage)xobject; 
        String name = null; 
        if (addKey) 
        { 
         name = getUniqueFileName(prefix + "_" + key, image.getSuffix()); 
        } 
        else 
        { 
         name = getUniqueFileName(prefix, image.getSuffix()); 
        } 
        System.out.println("Writing image:" + name); 
        image.write2file(name); 
       } 
       // maybe there are more images embedded in a form object 
       else if (xobject instanceof PDXObjectForm) 
       { 
        PDXObjectForm xObjectForm = (PDXObjectForm)xobject; 
        PDResources formResources = xObjectForm.getResources(); 
        processResources(formResources, prefix, addKey); 
       } 
      } 
     } 
    } 

    private String getUniqueFileName(String prefix, String suffix) 
    { 
     String uniqueName = null; 
     File f = null; 
     while(f == null || f.exists()) 
     { 
      uniqueName = prefix + "-" + imageCounter; 
      f = new File(uniqueName + "." + suffix); 
      imageCounter++; 
     } 
     return uniqueName; 
    } 

    /** 
    * This will print the usage requirements and exit. 
    */ 
    private static void usage() 
    { 
     System.err.println("Usage: java org.apache.pdfbox.ExtractImages [OPTIONS] <PDF file>\n" + 
      " -password <password>  Password to decrypt document\n" + 
      " -prefix <image-prefix>  Image prefix(default to pdf name)\n" + 
      " -addkey      add the internal image key to the file name\n" + 
      " -nonSeq      Enables the new non-sequential parser\n" + 
      " <PDF file>     The PDF document to use\n" 
      ); 
     System.exit(1); 
    } 

} 

teraz przyciąć zdjęcie, można użyć:

/** 
    * Crop the main image according to this rectangle, and scale it to the 
    * correct size for a thumbnail. 
    */ 
    public InputStream cropAndScale(InputStream mainImageStream, 
      CropRectangle crop) { 
     try { 
      RenderedOp mainImage = loadImage(mainImageStream); 
      RenderedOp opaqueImage = makeImageOpaque(mainImage); 
      RenderedOp croppedImage = cropImage(opaqueImage, crop); 
      RenderedOp scaledImage = scaleImage(croppedImage); 
      byte[] jpegBytes = encodeAsJpeg(scaledImage); 
      return new ByteArrayInputStream(jpegBytes); 
     } catch (Exception e) { 
      throw new IllegalStateException("Failed to scale the image", e); 
     } 
    } 

który jest dostępny w this page i project

Nie ma innej opcji do analizowania obrazów wewnątrz pliku pdf, spójrz at this code specjalnie this

+0

nie wiesz, dlaczego ta odpowiedź została wybrana, ponieważ zupełnie nie odpowiada na pytanie użytkowników. –

Powiązane problemy