版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2019.05.26 星期日 |
前言
Tesseract OCR
是谷歌Google維護(hù)的一個(gè)框架或舞,用于從圖片中提取文字哗魂,有iOS
和C++
多種版本,在很多領(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艾君,Windows
和Mac OS X
采够。
哦哦! 你打算如何在iOS中使用它冰垄? Nexor Technology為Tesseract 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ī)密碼董济。
接下來,cd
到Love 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
浪漫主義载矿!
現(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)。
您現(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è)段落断部。Tesseract
的pageSegmentationMode
讓Tesseract
引擎知道文本的劃分方式。在這種情況下班缎,將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é)果灼舍。
接下來,您將提高圖像的質(zhì)量涨薪。
Improving Image Quality
Tesseract iOS
框架曾經(jīng)有內(nèi)置的方法來提高圖像質(zhì)量骑素,但是這些方法已被棄用,框架的文檔現(xiàn)在建議使用Brad Larson
的GPUImage 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)注~~~