圖像閾值分割
圖像閾值分割,一種廣泛應(yīng)用的分割技術(shù),利用圖像中要提取的目標(biāo)區(qū)域與其背景在灰度特性上的差異,把圖像看作具有不同灰度級(jí)的兩類區(qū)域(目標(biāo)區(qū)域和背景區(qū)域)的組合,選取一個(gè)比較合理的閾值,以確定圖像中每個(gè)像素點(diǎn)應(yīng)該屬于目標(biāo)區(qū)域還是背景區(qū)域,從而產(chǎn)生相應(yīng)的二值圖像。
閾值分割法的特點(diǎn)是:適用于目標(biāo)與背景灰度有較強(qiáng)對(duì)比的情況,重要的是背景或物體的灰度比較單一,而且總可以得到封閉且連通區(qū)域的邊界。
圖像分割
圖像顏色的零界點(diǎn),圖像的分割基準(zhǔn),基于此可完成圖像的二值化,圖像二值化可用于OCR成圖像的分割(也是最為簡(jiǎn)單的一種),這種分割是基于圖像像素值級(jí)別的差異,且一般的對(duì)象是灰度圖像。
圖像閾值的進(jìn)一步處理就是二值化,二值化包含但不限于“大于閾值為255,小于閾值為0”的處理模式。
OCR (Optical Character Recognition,光學(xué)字符識(shí)別)
OCR指電子設(shè)備(如掃描儀或數(shù)碼相機(jī))檢查紙上打印的字符,通過(guò)檢測(cè)暗、亮的模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過(guò)程,即:針對(duì)印刷體字符,采用光學(xué)的方式將紙質(zhì)文檔中的文字轉(zhuǎn)換成為黑白點(diǎn)陣的圖像文件,并通過(guò)識(shí)別軟件將圖像中的文字轉(zhuǎn)換成文本格式,供文字處理軟件進(jìn)一步編輯加工的技術(shù)。如何除錯(cuò)或利用輔助信息提高識(shí)別正確率,是OCR最重要的課題,ICR(Intelligent Character Recognition)的名詞也因此而產(chǎn)生。衡量一個(gè)OCR系統(tǒng)性能好壞的主要指標(biāo)有:拒識(shí)率、誤識(shí)率、識(shí)別速度、用戶界面的友好性,產(chǎn)品的穩(wěn)定性,易用性及可行性等。
閾值化
閾值化是一種將想要在圖像中分析的區(qū)域分割出來(lái)的方法,每個(gè)像素值都與一個(gè)預(yù)設(shè)的閾值做比較,再根據(jù)比較的結(jié)果調(diào)整像素值。
1、二值閾值化 -> Imgproc.THRESH_BINARY
2、閾值化到零 -> Imgproc.THRESH_TOZERO
3、截?cái)嚅撝祷?-> Imgproc.THRESH_TRUNC
4、反轉(zhuǎn)二值閾值化 -> Imgproc.THRESH_BINARY_INV
5、反轉(zhuǎn)閾值化到零 -> Imgproc.THRESH_TOZERO_INV
代碼案例
package com.what21.opencv01.demo04;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
/**
* 圖像閾值分割(Imgproc.threshold)
*/
public class OpenCVThreshold {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
/**
* -DJAVA.library.path=D:/Apps/MyTool/opencv/build/java/x64
* @param args
*/
public static void main(String[] args) {
Mat src = Imgcodecs.imread("D:/1.jpg");
Imgcodecs.imwrite("D:/1-1.jpg", src);
Mat dst = new Mat();
Imgproc.threshold(src, dst, 100.0, 200.0, Imgproc.THRESH_BINARY_INV);
Imgcodecs.imwrite("D:/1-threshold_THRESH_BINARY_INV.jpg", dst);
Imgproc.threshold(src, dst, 100.0, 200.0, Imgproc.THRESH_TRUNC);
Imgcodecs.imwrite("D:/1-threshold_THRESH_TRUNC.jpg", dst);
Imgproc.threshold(src, dst, 100.0, 200.0, Imgproc.THRESH_BINARY);
Imgcodecs.imwrite("D:/1-threshold_THRESH_BINARY.jpg", dst);
Imgproc.threshold(src, dst, 100.0, 200.0, Imgproc.THRESH_TOZERO);
Imgcodecs.imwrite("D:/1-threshold_THRESH_TOZERO.jpg", dst);
Imgproc.threshold(src, dst, 100.0, 200.0, Imgproc.THRESH_TOZERO_INV);
Imgcodecs.imwrite("D:/1-threshold_THRESH_TOZERO_INV.jpg", dst);
}
}
1.jpg
1-threshold_THRESH_BINARY.jpg
1-threshold_THRESH_BINARY_INV.jpg
1-threshold_THRESH_TOZERO.jpg
1-threshold_THRESH_TOZERO_INV.jpg
1-threshold_THRESH_TRUNC.jpg