Tesseract OCR框架(二) —— 基于Tesseract OCR iOS框架的圖片中的文字識(shí)別簡單示例(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2019.05.26 星期日

前言

Tesseract OCR是谷歌Google維護(hù)的一個(gè)框架或舞,用于從圖片中提取文字哗魂,有iOSC++多種版本,在很多領(lǐng)域都有廣泛的應(yīng)用忱嘹。接下來我們就一起走進(jìn)這個(gè)框架(iOS部分)嘱腥。感興趣的可以看下面幾篇.
1. Tesseract OCR框架(一) —— 基本概覽(一)

開始

在本教程中,您將學(xué)習(xí)如何使用Tesseract使用OCR讀取和處理從圖像中提取的文本拘悦。

OCR是從圖像中電子提取文本的過程齿兔。 您以前無疑已經(jīng)看過它 - 它被廣泛用于處理從掃描文檔到平板電腦上的手寫涂鴉,再到 Word Lens technology in the GoogleTranslate app础米。

在本教程中分苇,您將學(xué)習(xí)如何使用由Google維護(hù)的開源OCR引擎Tesseract從愛情詩中獲取文本并使其成為您自己的文本。 準(zhǔn)備好留下深刻印象屁桑!

在本教程中组砚,您將學(xué)習(xí)如何使用由Google維護(hù)的開源OCR引擎Tesseract從愛情詩中獲取文本并使其成為您自己的文本。 準(zhǔn)備好留下深刻印象掏颊!

打開本教程的材料糟红,然后將文件夾解壓縮到方便的位置。

Love In a Snap目錄包含另外三個(gè):

  • Love In A Snap Starter:本教程的入門項(xiàng)目乌叶。
  • Love In A Snap Final:最后的項(xiàng)目盆偿。
  • Resources:您將使用OCR處理的圖像和包含Tesseract語言數(shù)據(jù)的目錄。

在打開Xcode中的Love In A Snap Starter/Love In A Snap.xcodeproj中准浴,然后構(gòu)建并運(yùn)行入門應(yīng)用程序事扭。 點(diǎn)擊一下即可了解用戶界面。

回到Xcode乐横,看一下ViewController.swift求橄。 它已經(jīng)包含一些@IBOutlets和空的@IBAction方法,它們將視圖控制器鏈接到其預(yù)制的Main.storyboard接口葡公。 它還包含performImageRecognition(_ :)罐农,在這里Tesseract最終將完成其工作。

向下滾動(dòng)頁面催什,你會(huì)看到:

// 1
// MARK: - UINavigationControllerDelegate
extension ViewController: UINavigationControllerDelegate {
}
// 2
// MARK: - UIImagePickerControllerDelegate
extension ViewController: UIImagePickerControllerDelegate {
  // 3
  func imagePickerController(_ picker: UIImagePickerController,
    didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    // TODO: Add more code here...
  }
}
  • 1) 您最終添加以便于圖像加載的UIImagePickerViewController需要UINavigationControllerDelegate來訪問圖像選擇器控制器的委托函數(shù)涵亏。
  • 2) 圖像選擇器還需要UIImagePickerControllerDelegate來訪問圖像選擇器控制器的代理函數(shù)。
  • 3) imagePickerController(_:didFinishPickingMediaWithInfo :)代理函數(shù)將返回所選圖像蒲凶。

現(xiàn)在气筋,輪到你接管并將這個(gè)應(yīng)用程序變?yōu)楝F(xiàn)實(shí)!


Tesseract’s Limitations

Tesseract OCR非常強(qiáng)大旋圆,但確實(shí)有以下限制:

  • 與某些OCR引擎不同 - 例如美國郵政局用于對(duì)郵件進(jìn)行分類的引擎 - Tesseract沒有接受過識(shí)別手寫的培訓(xùn)宠默,并且總共限制了大約100種字體。
  • Tesseract需要一些預(yù)處理來改善OCR結(jié)果:圖像需要適當(dāng)縮放灵巧,具有盡可能多的圖像對(duì)比度搀矫,并且文本必須水平對(duì)齊抹沪。
  • 最后,Tesseract OCR僅適用于Linux艾君,WindowsMac OS X采够。

哦哦! 你打算如何在iOS中使用它冰垄? Nexor TechnologyTesseract OCR創(chuàng)建了兼容的Swift包裝器蹬癌。


Adding the Tesseract Framework

首先,您必須通過CocoaPods安裝Tesseract OCR iOS虹茶,這是一個(gè)廣泛使用的iOS項(xiàng)目依賴管理器逝薪。

如果您尚未在計(jì)算機(jī)上安裝CocoaPods,請(qǐng)打開終端蝴罪,然后執(zhí)行以下命令:

sudo gem install cocoapods

在請(qǐng)求完成CocoaPods安裝時(shí)輸入您的計(jì)算機(jī)密碼董济。

接下來,cdLove In A Snap入門項(xiàng)目文件夾要门。 例如虏肾,如果您已將Love In A Snap添加到桌面,則可以輸入:

cd ~/Desktop/"Love In A Snap/Love In A Snap Starter"

接著欢搜,輸入:

pod init

這將為您的項(xiàng)目創(chuàng)建一個(gè)Podfile封豪。

用以下內(nèi)容替換Podfile的內(nèi)容:

platform :ios, '12.1'

target 'Love In A Snap' do
  use_frameworks!

  pod 'TesseractOCRiOS'

end

這告訴CocoaPods您希望將TesseractOCRiOS包含為項(xiàng)目的依賴項(xiàng)。

回到終端炒瘟,輸入:

pod install

pod安裝到你的項(xiàng)目

當(dāng)終端輸出指示時(shí)吹埠,“Please close any current Xcode sessions and use Love In A Snap.xcworkspace for this project from now on.”,在Xcode中打開Love In A Snap.xcworkspace疮装。


How Tesseract OCR Works

一般來說很泊,OCR使用人工智能來查找和識(shí)別圖像中的文本灾测。

一些OCR引擎依賴于一種稱為機(jī)器學(xué)習(xí)(machine learning)的人工智能。機(jī)器學(xué)習(xí)允許系統(tǒng)通過識(shí)別和預(yù)測(cè)模式來學(xué)習(xí)和適應(yīng)數(shù)據(jù)冻记。

Tesseract OCR iOS引擎使用稱為神經(jīng)網(wǎng)絡(luò)(neural network)的特定類型的機(jī)器學(xué)習(xí)模型隶债。

神經(jīng)網(wǎng)絡(luò)在人腦中的模型之后被松散地建模凝赛。我們的大腦包含大約860億個(gè)連接的神經(jīng)元躲履,這些神經(jīng)元被分組成各種網(wǎng)絡(luò)炼幔,能夠通過重復(fù)學(xué)習(xí)特定的功能。類似地滚局,在更簡單的尺度上,人工神經(jīng)網(wǎng)絡(luò)接收多種樣本輸入顽频,并通過隨時(shí)間的成功和失敗來學(xué)習(xí)藤肢,從而產(chǎn)生越來越準(zhǔn)確的輸出。這些樣本輸入稱為“訓(xùn)練數(shù)據(jù)”糯景。

在教育系統(tǒng)時(shí)嘁圈,這個(gè)培訓(xùn)數(shù)據(jù):

  • 1) 通過神經(jīng)網(wǎng)絡(luò)的輸入節(jié)點(diǎn)進(jìn)入省骂。
  • 2) 通過稱為“edges”的節(jié)點(diǎn)間連接進(jìn)行傳播,每個(gè)連接都以輸入應(yīng)該沿著該路徑傳播的感知概率加權(quán)最住。
  • 3) 通過一層或多層“hidden”(即內(nèi)部)節(jié)點(diǎn)钞澳,這些節(jié)點(diǎn)使用預(yù)定的啟發(fā)式處理數(shù)據(jù)。
  • 4) 通過輸出節(jié)點(diǎn)返回預(yù)測(cè)結(jié)果涨缚。

然后將該輸出與期望的輸出進(jìn)行比較轧粟,并相應(yīng)地調(diào)整邊緣權(quán)重,使得傳遞到神經(jīng)網(wǎng)絡(luò)的后續(xù)訓(xùn)練數(shù)據(jù)返回越來越準(zhǔn)確的結(jié)果脓魏。

Tesseract尋找像素兰吟,字母,單詞和句子的圖案茂翔。 Tesseract使用稱為自適應(yīng)識(shí)別(adaptive recognition)的雙通道方法混蔼。 對(duì)數(shù)據(jù)進(jìn)行一次傳遞以識(shí)別字符,然后第二次傳遞以填寫任何不太可能符合給定單詞或句子上下文的字母的字母珊燎。


Adding Trained Data

為了在給定語言的范圍內(nèi)更好地磨練其預(yù)測(cè)惭嚣,Tesseract需要特定于語言的訓(xùn)練數(shù)據(jù)來執(zhí)行其OCR

導(dǎo)航到Finder中的Love In A Snap/Resources悔政。 tessdata文件夾包含一堆英語和法語培訓(xùn)文件晚吞。 你將在本教程中處理的愛情詩主要是英文,但也包含一些法語卓箫。 Très浪漫主義载矿!

Your poem vil impress vith French! Ze language ov love! *Haugh* *Haugh* *Haugh*

現(xiàn)在,您將tessdata添加到您的項(xiàng)目中烹卒。 Tesseract OCR iOS要求您添加tessdata作為引用文件夾闷盔。

  • 1) 將tessdata文件夾從Finder拖到Xcode左側(cè)Project導(dǎo)航器中的Love In A Snap文件夾中。
  • 2)選擇Copy items if needed
  • 3) 將Added Folders選項(xiàng)設(shè)置為Create folder references旅急。
  • 4) 單擊Finish之前逢勾,確認(rèn)已選擇目標(biāo)。
Add tessdata as a referenced folder

您現(xiàn)在應(yīng)該在導(dǎo)航器中看到一個(gè)藍(lán)色的tessdata文件夾藐吮。 藍(lán)色表示引用了文件夾而不是Xcode組溺拱。

現(xiàn)在您已經(jīng)添加了Tesseract框架和語言數(shù)據(jù),現(xiàn)在是時(shí)候開始使用有趣的編碼了谣辞!


Loading the Image

首先迫摔,您將創(chuàng)建一種從設(shè)備的相機(jī)或照片庫訪問圖像的方法。

打開ViewController.swift并將以下內(nèi)容插入takePhoto(_ :)

// 1
let imagePickerActionSheet =
  UIAlertController(title: "Snap/Upload Image",
                    message: nil,
                    preferredStyle: .actionSheet)

// 2
if UIImagePickerController.isSourceTypeAvailable(.camera) {
  let cameraButton = UIAlertAction(
    title: "Take Photo",
    style: .default) { (alert) -> Void in
      // TODO: Add more code here...
  }
  imagePickerActionSheet.addAction(cameraButton)
}

// 3
let libraryButton = UIAlertAction(
  title: "Choose Existing",
  style: .default) { (alert) -> Void in
    // TODO: Add more code here...
}
imagePickerActionSheet.addAction(libraryButton)

// 4
let cancelButton = UIAlertAction(title: "Cancel", style: .cancel)
imagePickerActionSheet.addAction(cancelButton)

// 5
present(imagePickerActionSheet, animated: true)

在這里泥从,您:

  • 1) 創(chuàng)建將顯示在屏幕底部的action sheet alert句占。
  • 2) 如果設(shè)備有攝像頭,請(qǐng)?jiān)诓僮鞅碇刑砑?code>Take Photo按鈕躯嫉。
  • 3) 將Choose Existing按鈕添加到操作表纱烘。
  • 4) 在操作表中添加Cancel按鈕杨拐。 選擇此按鈕會(huì)刪除操作表而不執(zhí)行操作,因?yàn)樗念愋蜑?code>.cancel擂啥。
  • 5) 最后哄陶,present the alert

import UIKit之后立即添加:

import MobileCoreServices

這使ViewController可以訪問kUTTypeImage抽象圖像標(biāo)識(shí)符哺壶,您將使用它來限制圖像選擇器的媒體類型屋吨。

現(xiàn)在在cameraButton UIAlertAction的閉包中,用以下代碼替換// TODO注釋:

// 1
self.activityIndicator.startAnimating()
// 2
let imagePicker = UIImagePickerController()
// 3
imagePicker.delegate = self
// 4
imagePicker.sourceType = .camera
// 5
imagePicker.mediaTypes = [kUTTypeImage as String]
// 6
self.present(imagePicker, animated: true, completion: {
  // 7
  self.activityIndicator.stopAnimating()
})

所以當(dāng)用戶點(diǎn)擊cameraButton時(shí)变骡,這段代碼:

  • 1) 顯示視圖控制器的活動(dòng)指示器离赫。
  • 2) 創(chuàng)建圖像選擇器。
  • 3) 將當(dāng)前視圖控制器指定為該圖像選擇器的委托塌碌。
  • 4) 告訴圖像選擇器作為相機(jī)界面呈現(xiàn)給用戶渊胸。
  • 5) 限制圖像選擇器的媒體類型,以便用戶只能捕獲靜止圖像台妆。
  • 6) 顯示圖像選擇器翎猛。
  • 7) 一旦圖像選擇器完成動(dòng)畫進(jìn)入視圖,就隱藏活動(dòng)指示器接剩。

同樣切厘,在libraryButton的閉包中,添加:

self.activityIndicator.startAnimating()
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes = [kUTTypeImage as String]
self.present(imagePicker, animated: true, completion: {
  self.activityIndicator.stopAnimating()
})

這與您剛剛添加到cameraButton的閉包中的代碼相同懊缺,除了imagePicker.sourceType = .photoLibrary疫稿。 在這里,您將圖像選擇器設(shè)置為顯示設(shè)備的照片庫而不是相機(jī)鹃两。

接下來遗座,要處理捕獲或選定的圖像,請(qǐng)將以下內(nèi)容插入imagePickerController(_:didFinishPickingMediaWithInfo :)

// 1
guard let selectedPhoto =
  info[.originalImage] as? UIImage else {
    dismiss(animated: true)
    return
}
// 2
activityIndicator.startAnimating()
// 3
dismiss(animated: true) {
  self.performImageRecognition(selectedPhoto)
}

在這里俊扳,您:

  • 1) 檢查info.originalImage鍵是否包含圖像值途蒋。 如果沒有,則圖像選擇器將自己從視圖中移除馋记,并且該方法的其余部分不會(huì)執(zhí)行号坡。
  • 2) 如果info.originalImage確實(shí)包含圖像,則在Tesseract完成其工作時(shí)顯示活動(dòng)指示符梯醒。
  • 3) 在圖像選擇器動(dòng)畫不在視圖之外后宽堆,將圖像傳遞給performImageRecognition

您將在本教程的下一部分中編寫performImageRecognition代碼茸习,但是日麸,現(xiàn)在,只需打開Info.plist逮光。 將光標(biāo)懸停在頂部單元格信息屬性列表上代箭,然后在出現(xiàn)時(shí)單擊+按鈕兩次。

在這兩個(gè)新條目的密鑰字段中涕刚,將Privacy – Camera Usage Description添加到另一個(gè)和Privacy – Photo Library Usage Description到另一個(gè)嗡综。 為每個(gè)選擇String類型。 然后在Value列中杜漠,分別在請(qǐng)求訪問其相機(jī)和照片庫的權(quán)限時(shí)极景,輸入要向用戶顯示的任何文本。

構(gòu)建并運(yùn)行您的項(xiàng)目驾茴。 點(diǎn)擊Snap / Upload Image按鈕盼樟,您將看到剛剛創(chuàng)建的UIAlertController

測(cè)試出操作表選項(xiàng)锈至,并在出現(xiàn)提示時(shí)授予應(yīng)用程序訪問相機(jī)和/或庫的權(quán)限晨缴。 按預(yù)期確認(rèn)照片庫和相機(jī)顯示。

注意:如果您在模擬器上運(yùn)行峡捡,則沒有可用的物理相機(jī)击碗,因此您將看不到Take Photo選項(xiàng)。

都好们拙? 如果是這樣稍途,那么終于可以使用Tesseract了!


Implementing Tesseract OCR

首先砚婆,添加import MobileCoreServices以下械拍,使ViewController可以使用Tesseract框架:

import TesseractOCR

現(xiàn)在,在performImageRecognition(_ :)中装盯,用以下內(nèi)容替換// TODO注釋:

// 1
if let tesseract = G8Tesseract(language: "eng+fra") {
  // 2
  tesseract.engineMode = .tesseractCubeCombined
  // 3
  tesseract.pageSegmentationMode = .auto
  // 4
  tesseract.image = image
  // 5
  tesseract.recognize()
  // 6
  textView.text = tesseract.recognizedText
}
// 7
activityIndicator.stopAnimating()

由于這是本教程的內(nèi)容坷虑,這里有一個(gè)詳細(xì)的細(xì)分,一行一行:

  • 1) 使用新的G8Tesseract對(duì)象初始化tesseract验夯,該對(duì)象將使用英語(“eng”) - 和法語(“fra”) - 訓(xùn)練有素的語言數(shù)據(jù)猖吴。請(qǐng)注意,詩的法語重音字符不在英文字符集中挥转,因此必須包含法語訓(xùn)練數(shù)據(jù)以便出現(xiàn)這些重音符號(hào)海蔽。
  • 2) Tesseract提供三種不同的OCR引擎模式:.tesseractOnly,這是最快但最不準(zhǔn)確的方法绑谣;.cubeOnly党窜,由于它采用了更多的人工智能,因此速度更慢但更準(zhǔn)確借宵;和.tesseractCubeCombined幌衣,它同時(shí)運(yùn)行.tesseractOnly.cubeOnly.tesseractCubeCombined是最慢的,但由于它是最準(zhǔn)確的豁护,你將在本教程中使用它哼凯。
  • 3) 默認(rèn)情況下,Tesseract假定它正在處理統(tǒng)一的文本塊楚里,但您的樣本圖像有多個(gè)段落断部。 TesseractpageSegmentationModeTesseract引擎知道文本的劃分方式。在這種情況下班缎,將pageSegmentationMode設(shè)置為.auto以允許全自動(dòng)頁面分段蝴光,從而能夠識(shí)別段落中斷。
  • 4) 將所選圖像分配給tesseract實(shí)例达址。
  • 5) 告訴Tesseract開始識(shí)別你的文字蔑祟。
  • 6) 將Tesseract的識(shí)別文本輸出放入textView
  • 7) 自OCR完成后隱藏活動(dòng)指示器沉唠。

現(xiàn)在疆虚,是時(shí)候測(cè)試第一批新代碼了!


Processing Your First Image

Finder中右冻,導(dǎo)航到Love In A Snap / Resources / Lenore.png以查找示例圖像装蓬。

Lenore.png是一首寫給“Lenore”的愛情詩的形象,但通過一些編輯纱扭,你可以把它變成一首肯定會(huì)引起你所渴望的人的注意的詩牍帚!

雖然您可以打印圖像的副本,然后使用應(yīng)用程序拍攝照片以執(zhí)行OCR乳蛾,您可以輕松自己并將圖像直接添加到設(shè)備的相機(jī)膠卷暗赶。 這消除了人為錯(cuò)誤,進(jìn)一步照明不一致肃叶,文本偏斜和打印有缺陷的可能性蹂随。 畢竟,圖像已經(jīng)是黑暗和模糊的因惭。

注意:如果您使用的是模擬器岳锁,只需將圖像文件拖放到模擬器上即可將其添加到其照片庫中。

構(gòu)建并運(yùn)行您的應(yīng)用程序蹦魔。 點(diǎn)擊Snap / Upload Image激率,點(diǎn)擊Choose Existing,然后從照片庫中選擇樣本圖像以通過OCR運(yùn)行它勿决。

注意:您可以放心地忽略TesseractOCR庫生成的數(shù)百個(gè)編譯警告乒躺。

哦哦! 什么都沒出現(xiàn)低缩! 這是因?yàn)楫?dāng)前的圖像尺寸太大嘉冒,以至于Tesseract無法處理。 是時(shí)候改變了!


Scaling Images While Preserving Aspect Ratio

圖像的縱橫比aspect ratio是其寬度和高度之間的比例關(guān)系讳推。 從數(shù)學(xué)上講顶籽,要在不影響縱橫比的情況下縮小原始圖像的大小,必須保持寬高比不變娜遵。

當(dāng)您知道原始圖像的高度和寬度蜕衡,并且您知道最終圖像的所需高度或?qū)挾葧r(shí),您可以重新排列寬高比等式设拟,如下所示:

這導(dǎo)致兩個(gè)公式。

公式1:當(dāng)圖像的寬度大于其高度時(shí)久脯。

Height1/Width1 * width2 = height2

公式2:當(dāng)圖像的高度大于其寬度時(shí)纳胧。

Width1/Height1 * height2 = width2

現(xiàn)在,將以下擴(kuò)展和方法添加到ViewController.swift的底部:

// MARK: - UIImage extension

//1
extension UIImage {
  // 2
  func scaledImage(_ maxDimension: CGFloat) -> UIImage? {
    // 3
    var scaledSize = CGSize(width: maxDimension, height: maxDimension)
    // 4
    if size.width > size.height {
      scaledSize.height = size.height / size.width * scaledSize.width
    } else {
      scaledSize.width = size.width / size.height * scaledSize.height
    }
    // 5
    UIGraphicsBeginImageContext(scaledSize)
    draw(in: CGRect(origin: .zero, size: scaledSize))
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    // 6
    return scaledImage
  }
}

此代碼執(zhí)行以下操作:

  • 1) UIImage擴(kuò)展允許您直接通過UIImage對(duì)象訪問它包含的任何方法帘撰。
  • 2) scaledImage(_ :)接收返回圖像所需的最大尺寸(高度或?qū)挾龋?/li>
  • 3) scaledSize變量最初包含一個(gè)CGSize跑慕,其高度和寬度等于maxDimension
  • 4) 您可以計(jì)算UIImage的較小尺寸摧找,以便scaledSize保留圖像的縱橫比核行。 如果圖像的寬度大于其高度,請(qǐng)使用公式1蹬耘。否則芝雪,使用公式2。
  • 5) 創(chuàng)建圖像上下文综苔,將原始圖像繪制為大小為scaledSize的矩形惩系,然后在結(jié)束上下文之前從該上下文中獲取圖像。
  • 6) 返回結(jié)果圖像如筛。

現(xiàn)在堡牡,在performImageRecognition(_ :)的頂部,包括:

let scaledImage = image.scaledImage(1000) ?? image

這將嘗試縮放圖像杨刨,使其不超過1,000點(diǎn)寬或長晤柄。 如果scaledImage()無法返回縮放圖像,則常量將默認(rèn)為原始圖像妖胀。

然后芥颈,將tesseract.image = image替換為:

tesseract.image = scaledImage

這會(huì)將縮放后的圖像指定給Tesseract對(duì)象。

從照片庫中再次構(gòu)建做粤,運(yùn)行和選擇詩歌浇借。

但很可能你的結(jié)果并不完美。 還有改進(jìn)的余地......


Improving OCR Accuracy

“Garbage In怕品,Garbage Out.”提高輸出質(zhì)量的最簡單方法是提高輸入質(zhì)量妇垢。 正如谷歌在其Tesseract OCR網(wǎng)站上列出的那樣As Google lists on their Tesseract OCR site,黑暗或不均勻的照明,圖像噪聲闯估,傾斜的文本方向和厚厚的暗圖像邊界都會(huì)導(dǎo)致不太完美的結(jié)果灼舍。

Examples of potentially problematic image inputs that can be corrected for improved results. Source: Google’s Tesseract OCR site.

接下來,您將提高圖像的質(zhì)量涨薪。


Improving Image Quality

Tesseract iOS框架曾經(jīng)有內(nèi)置的方法來提高圖像質(zhì)量骑素,但是這些方法已被棄用,框架的文檔現(xiàn)在建議使用Brad LarsonGPUImage framework框架刚夺。

GPUImage可以通過CocoaPods獲得献丑,因此在Podfile中的pod'TesseractOCRiOS'下面,添加:

pod 'GPUImage'

然后侠姑,在終端中创橄,重新運(yùn)行:

pod install

現(xiàn)在應(yīng)該可以在項(xiàng)目中使用GPUImage

注意:它還會(huì)添加數(shù)百個(gè)編譯警告莽红。 您也可以放心地忽略它們妥畏。

回到ViewController.swift,添加以下import TesseractOCR以使類中的GPUImage可用:

import GPUImage

直接在scaledImage(_ :)下面安吁,也在UIImage擴(kuò)展名中醉蚁,添加:

func preprocessedImage() -> UIImage? {
  // 1
  let stillImageFilter = GPUImageAdaptiveThresholdFilter()
  // 2
  stillImageFilter.blurRadiusInPixels = 15.0
  // 3
  let filteredImage = stillImageFilter.image(byFilteringImage: self)
  // 4
  return filteredImage
}

在這里,您:

  • 1) 初始化GPUImageAdaptiveThresholdFilter鬼店。 GPUImageAdaptiveThresholdFilter確定像素周圍的局部亮度网棍,如果低于該局部亮度則將像素變?yōu)楹谏绻哂诖酥祫t變?yōu)榘咨?這對(duì)于在不同光照條件下挑選文本非常有用薪韩。
  • 2) blurRadius表示每個(gè)字符的平均模糊度(以像素為單位)确沸。 它默認(rèn)為4.0,但您可以使用此值來改善OCR結(jié)果俘陷。 在上面的代碼中罗捎,您將其設(shè)置為15.0,因?yàn)楫?dāng)圖像寬度為1,000點(diǎn)時(shí)拉盾,平均字符模糊看起來大約為15.0像素寬桨菜。
  • 3) 通過過濾器運(yùn)行圖像以選擇性地返回新的圖像對(duì)象。
  • 4) 如果過濾器返回圖像捉偏,則返回該圖像倒得。

回到performImageRecognition(_ :),緊接在scaledImage常量實(shí)例化下面夭禽,添加:

let preprocessedImage = scaledImage.preprocessedImage() ?? scaledImage

此代碼嘗試通過GPUImage過濾器運(yùn)行scaledImage霞掺,但如果preprocessedImage()的過濾器失敗,則默認(rèn)使用未過濾的scaledImage讹躯。

然后菩彬,將tesseract.image = scaledImage替換為:

tesseract.image = preprocessedImage

這要求Tesseract處理縮放和過濾的圖像缠劝。

現(xiàn)在您已經(jīng)完成所有這些工作,再次構(gòu)建骗灶,運(yùn)行并選擇圖像惨恭。

瞧! 希望您的結(jié)果現(xiàn)在比以前更完美或更接近完美耙旦。

但如果你眼中的蘋果沒有被命名為“Lenore”脱羡,那么他或她可能不會(huì)欣賞這首來自你的詩......他們可能想知道這個(gè)“Lenore”角色是誰!

“Lenore”替換為您心愛的人的姓名... presto chango免都! 你已經(jīng)為你的愛人和你的愛人創(chuàng)作了一首愛情詩锉罐。

而已! 你的Love In A Snap應(yīng)用程序是完整的 - 肯定會(huì)贏得你崇拜的人的心臟琴昆。

嘗試使用其他文本的應(yīng)用程序氓鄙,以查看OCR結(jié)果如何在源之間變化,并根據(jù)需要下載更多語言數(shù)據(jù)download more language data业舍。

您還可以訓(xùn)練Tesseract以進(jìn)一步提高其輸出。 畢竟升酣,如果你能夠用眼睛或耳朵甚至指尖解讀字符舷暮,你就已經(jīng)成為字符識(shí)別方面的可認(rèn)證專家,并且完全有能力教你的電腦噩茄,而不是已經(jīng)知道的下面。

后記

本篇主要講述了基于Tesseract OCR iOS框架的圖片中的文字識(shí)別簡單示例的基本情況,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绩聘,一起剝皮案震驚了整個(gè)濱河市沥割,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凿菩,老刑警劉巖机杜,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衅谷,居然都是意外死亡椒拗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門获黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀苛,“玉大人,你說我怎么就攤上這事玷氏《挛矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵盏触,是天一觀的道長渗蟹。 經(jīng)常有香客問我块饺,道長,這世上最難降的妖魔是什么拙徽? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任刨沦,我火速辦了婚禮,結(jié)果婚禮上膘怕,老公的妹妹穿的比我還像新娘想诅。我一直安慰自己,他們只是感情好岛心,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布来破。 她就那樣靜靜地躺著,像睡著了一般忘古。 火紅的嫁衣襯著肌膚如雪徘禁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天髓堪,我揣著相機(jī)與錄音送朱,去河邊找鬼。 笑死干旁,一個(gè)胖子當(dāng)著我的面吹牛驶沼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播争群,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼回怜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了换薄?” 一聲冷哼從身側(cè)響起玉雾,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轻要,沒想到半個(gè)月后复旬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伦腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赢底,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柏蘑。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幸冻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咳焚,到底是詐尸還是另有隱情洽损,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布革半,位于F島的核電站碑定,受9級(jí)特大地震影響流码,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜延刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一漫试、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碘赖,春花似錦驾荣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撼班,卻和暖如春歧匈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砰嘁。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工件炉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矮湘。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓妻率,卻偏偏與公主長得像,于是被迫代替她去往敵國和親板祝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容