2017-03-12 51 views
0

我正在使用Swift 3構建移動應用程序,該應用程序允許用戶拍攝照片並在生成的圖像上運行Tesseract OCR。Swift 3 - 如何提高Tesseract的圖像質量?

但是,我一直在試圖提高掃描的質量,它似乎並沒有太多的工作。我已將照片分割成更加「放大」的區域,我想辨認甚至嘗試將其變爲黑白。是否有任何「增強」或優化圖像質量/尺寸的策略,以便Tesseract更好地識別它?謝謝!

tesseract.image = // the camera photo here 
tesseract.recognize() 
print(tesseract.recognizedText) 

我得到了這些錯誤,而且不知道該怎麼做:

Error in pixCreateHeader: depth must be {1, 2, 4, 8, 16, 24, 32} 
Error in pixCreateNoInit: pixd not made 
Error in pixCreate: pixd not made 
Error in pixGetData: pix not defined 
Error in pixGetWpl: pix not defined 
2017-03-11 22:22:30.019717 ProjectName[34247:8754102] Cannot convert image to Pix with bpp = 64 
Error in pixSetYRes: pix not defined 
Error in pixGetDimensions: pix not defined 
Error in pixGetColormap: pix not defined 
Error in pixClone: pixs not defined 
Error in pixGetDepth: pix not defined 
Error in pixGetWpl: pix not defined 
Error in pixGetYRes: pix not defined 
Please call SetImage before attempting recognition.Please call SetImage before attempting recognition.2017-03-11 22:22:30.026605 EOB-Reader[34247:8754102] No recognized text. Check that -[Tesseract setImage:] is passed an image bigger than 0x0. 

回答

4

香港專業教育學院使用下面的快捷3被使用的Tesseract相當成功:

func performImageRecognition(_ image: UIImage) { 

    let tesseract = G8Tesseract(language: "eng") 
    var textFromImage: String? 
    tesseract?.engineMode = .tesseractCubeCombined 
    tesseract?.pageSegmentationMode = .singleBlock 
    tesseract?.image = imageView.image 
    tesseract?.recognize() 
    textFromImage = tesseract?.recognizedText 
    print(textFromImage!) 
} 

我還發現預處理圖像也有幫助。我增加了以下擴展的UIImage

進口的UIKit 進口CoreImage

extension UIImage { 

     func toGrayScale() -> UIImage { 

      let greyImage = UIImageView() 
      greyImage.image = self 
      let context = CIContext(options: nil) 
      let currentFilter = CIFilter(name: "CIPhotoEffectNoir") 
      currentFilter!.setValue(CIImage(image: greyImage.image!), forKey: kCIInputImageKey) 
      let output = currentFilter!.outputImage 
      let cgimg = context.createCGImage(output!,from: output!.extent) 
      let processedImage = UIImage(cgImage: cgimg!) 
      greyImage.image = processedImage 

      return greyImage.image! 
     } 

     func binarise() -> UIImage { 

      let glContext = EAGLContext(api: .openGLES2)! 
      let ciContext = CIContext(eaglContext: glContext, options: [kCIContextOutputColorSpace : NSNull()]) 
      let filter = CIFilter(name: "CIPhotoEffectMono") 
      filter!.setValue(CIImage(image: self), forKey: "inputImage") 
      let outputImage = filter!.outputImage 
      let cgimg = ciContext.createCGImage(outputImage!, from: (outputImage?.extent)!) 

      return UIImage(cgImage: cgimg!) 
     } 

     func scaleImage() -> UIImage { 

      let maxDimension: CGFloat = 640 
      var scaledSize = CGSize(width: maxDimension, height: maxDimension) 
      var scaleFactor: CGFloat 

      if self.size.width > self.size.height { 
       scaleFactor = self.size.height/self.size.width 
       scaledSize.width = maxDimension 
       scaledSize.height = scaledSize.width * scaleFactor 
      } else { 
       scaleFactor = self.size.width/self.size.height 
       scaledSize.height = maxDimension 
       scaledSize.width = scaledSize.height * scaleFactor 
      } 

      UIGraphicsBeginImageContext(scaledSize) 
      self.draw(in: CGRect(x: 0, y: 0, width: scaledSize.width, height: scaledSize.height)) 
      let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return scaledImage! 
     } 

     func orientate(img: UIImage) -> UIImage { 

      if (img.imageOrientation == UIImageOrientation.up) { 
       return img; 
      } 

      UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale) 
      let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height) 
      img.draw(in: rect) 

      let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
      UIGraphicsEndImageContext() 

      return normalizedImage 

     } 

    } 

,然後將圖像傳遞到performImageRecognition

func processImage() { 

    self.imageView.image! = self.imageView.image!.toGrayScale() 
    self.imageView.image! = self.imageView.image!.binarise() 
    self.imageView.image! = self.imageView.image!.scaleImage() 
} 

希望之前調用此這有助於