Swift 3 - How do I improve image quality for Tesseract?

旧城冷巷雨未停 提交于 2019-12-04 21:13:24

ive been using tesseract fairly successfully in swift 3 using the following:

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!)
}

I also found pre-processing the image helped too. I added the following extension to UIImage

import UIKit import 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

        }

    }

And then called this before passing the image to performImageRecognition

func processImage() {

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

Hope this helps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!