二值化图像的欧拉数_Android OpenCV(八):图像二值化
生活随笔
收集整理的這篇文章主要介紹了
二值化图像的欧拉数_Android OpenCV(八):图像二值化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖像二值化
簡介
圖像二值化( Image Binarization)就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的黑白效果的過程。在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓。原理
圖像的二值化處理就是將圖像上的點的灰度值為0或255,也就是將整個圖像呈現出明顯的黑白效果。即將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數字圖像處理中,二值圖像占有非常重要的地位,特別是在實用的圖像處理中,以二值圖像處理實現而構成的系統是很多的,要進行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,這樣子有利于在對圖像做進一步處理時,圖像的集合性質只與像素值為0或255的點的位置有關,不再涉及像素的多級值,使處理變得簡單,而且數據的處理和壓縮量小。為了得到理想的二值圖像,一般采用封閉、連通的邊界定義不交疊的區域。所有灰度大于或等于閾值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點被排除在物體區域以外,灰度值為0,表示背景或者例外的物體區域。 如果某特定物體在內部有均勻一致的灰度值,并且其處在一個具有其他等級灰度值的均勻背景下,使用閾值法就可以得到比較的分割效果。如果物體同背景的差別表現不在灰度值上(比如紋理不同),可以將這個差別特征轉換為灰度的差別,然后利用閾值選取技術來分割該圖像。動態調節閾值實現圖像的二值化可動態觀察其分割圖像的具體結果。API
全局閾值化:threshold
public static double threshold(Mat src, Mat dst, double thresh, double maxval, int type)- 參數一:src,待二值化的多通道圖像,只能是CV_8U和CV_32F兩種數據類型
- 參數二:dst,二值化后的圖像,與輸入圖像具有相同的尺寸、類型和通道數
- 參數三:thresh,二值化的閾值
- 參數四:maxval,二值化過程的最大值,此函數只在THRESH_BINARY和THRESH_BINARY_INV兩種二值化方法中才使用
- 參數五:type,二值化類型
二值化類型
// C++: enum ThresholdTypes public static final intTHRESH_BINARY = 0,THRESH_BINARY_INV = 1,THRESH_TRUNC = 2,THRESH_TOZERO = 3,THRESH_TOZERO_INV = 4,THRESH_MASK = 7,THRESH_OTSU = 8,THRESH_TRIANGLE = 16; bledata-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">THRESH_OTSU和THRESH_TRIANGLE
這兩種標志是獲取閾值的方法,并不是閾值的比較方法的標志,這兩個標志可以和前面5種標志一起使用,例如“THRESH_BINARY| THRESH_OTSU”。前面5種標志在調用函數時都需要人為的設置閾值,如果對圖像不了解設置的閾值不合理,會對處理后的效果造成嚴重的影響,這兩個標志分別表示利用大津法(OTSU)和三角形法(TRIANGLE)結合圖像灰度值分布特性獲取二值化的閾值,并將閾值以函數返回值的形式給出。因此如果函數最后一個參數設置了這兩個標志中的任何一個,那么函數第三個參數thresh將由系統自動給出,但是在調用函數的時候仍然不能缺省,只是程序不會使用這個數值。目前,只有針對CV_8UC1圖像可使用這兩種標志位。
大津法(OTSU):最適用于雙波峰
大津法又叫最大類間方差法、最大類間閾值法(OTSU)。它的基本思想是,用一個閾值將圖像中的數據分為兩類,一類中圖像的像素點的灰度均小于這個閾值,另一類中的圖像的像素點的灰度均大于或者等于該閾值。如果這兩個類中像素點的灰度的方差越大,說明獲取到的閾值就是最佳的閾值(方差是灰度分布均勻性的一種度量,背景和前景之間的類間方差越大,說明構成圖像的兩部分的差別越大,當部分前景錯分為背景或部分背景錯分為前景都會導致兩部分差別變小。因此,使類間方差最大的分割意味著錯分概率最小。)。則利用該閾值可以將圖像分為前景和背景兩個部分。而我們所感興趣的部分一般為前景。三角形法(TRIANGLE):最適用于單個波峰,最開始用于醫學分割細胞等
三角法求閾值最早見于Zack的論文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色體的研究,該方法是使用直方圖數據,基于純幾何方法來尋找最佳閾值,它的成立條件是假設直方圖最大波峰在靠近最亮的一側,然后通過三角形求得最大直線距離,根據最大直線距離對應的直方圖灰度等級即為分割閾值,圖示如下: 在直方圖上從最高峰處bmx到最暗對應直方圖bmin(p=0)%構造一條直線,從bmin處開始計算每個對應的直方圖b到直線的垂直距離,知道bmax為止,其中最大距離對應的直方圖位置即為圖像二值化對應的閾值T。
有時候最大波峰對應位置不在直方圖最亮一側,而在暗的一側,這樣就需要翻轉直方圖,翻轉之后求得值,用255減去即得到為閾值T。擴展情況的直方圖表示如下:
算法步驟
局部閾值化:adaptiveThreshold
局部自適應閾值是根據像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。這樣做的好處在于每個像素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域像素的分布來決定的。亮度較高的圖像區域的二值化閾值通常會較高,而亮度較低的圖像區域的二值化閾值則會相適應地變小。不同亮度、對比度、紋理的局部圖像區域將會擁有相對應的局部二值化閾值。public static void adaptiveThreshold(Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)- 參數一:src,待二值化的圖像,圖像只能是CV_8UC1數據類型
- 參數二:dst,二值化后的圖像,與輸入圖像具有相同的尺寸、類型
- 參數三:maxValue,二值化的最大值
- 參數四:adaptiveMethod,自適應閾值算法,分為均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C這兩種。
- 參數五:thresholdType,選擇圖像二值化方法的標志,只能是THRESH_BINARY和THRESH_BINARY_INV
- 參數六:blockSize,自適應確定閾值的像素鄰域大小,一般為3,5,7的奇數
- 參數七:C,從平均值或者加權平均值中減去的常數,可以為正,也可以為負
自適應閾值算法
// C++: enum AdaptiveThresholdTypes public static final intADAPTIVE_THRESH_MEAN_C = 0,ADAPTIVE_THRESH_GAUSSIAN_C = 1; bledata-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">操作
private fun threshold(type: Int) {val ret = Mat()Imgproc.threshold(mGray, ret, 127.toDouble(), 255.toDouble(), type)showMat(ret)title = getTypeName(type) }private fun adaptiveMean() {val ret = Mat()Imgproc.adaptiveThreshold(mGray,ret,255.toDouble(),Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY,55,0.0)showMat(ret)title = "ADAPTIVE_THRESH_MEAN_C" }結果
源碼
onlyloveyd/LearningAndroidOpenCV?github.com掃碼關注總結
以上是生活随笔為你收集整理的二值化图像的欧拉数_Android OpenCV(八):图像二值化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国产122实验坦克的发展之路
- 下一篇: as工程放到源码编译_关于AS高版本SD