OpenCV阈值分割
什么是閾值?
最簡(jiǎn)單的圖像分割的方法。
應(yīng)用舉例:從一副圖像中利用閾值分割出我們需要的物體部分(當(dāng)然這里的物體可以是一部分或者整體)。這樣的圖像分割方法是基于圖像中物體與背景之間的灰度差異,而且此分割屬于像素級(jí)的分割。
為了從一副圖像中提取出我們需要的部分,應(yīng)該用圖像中的每一個(gè)像素點(diǎn)的灰度值與選取的閾值進(jìn)行比較,并作出相應(yīng)的判斷。(注意:閾值的選取依賴(lài)于具體的問(wèn)題。即:物體在不同的圖像中有可能會(huì)有不同的灰度值。
一旦找到了需要分割的物體的像素點(diǎn),我們可以對(duì)這些像素點(diǎn)設(shè)定一些特定的值來(lái)表示。(例如:可以將該物體的像素點(diǎn)的灰度值設(shè)定為:‘0’(黑色),其他的像素點(diǎn)的灰度值為:‘255’(白色);當(dāng)然像素點(diǎn)的灰度值可以任意,但最好設(shè)定的兩種顏色對(duì)比度較強(qiáng),方便觀察結(jié)果)。
?
閾值化的類(lèi)型
二進(jìn)制閾值化 0: THRESH_BINARY ? ? ? ? -當(dāng)前點(diǎn)值大于閾值時(shí),取Maxval,否則設(shè)置為0
-
該閾值化類(lèi)型如下式所示:
-
解釋:在運(yùn)用該閾值類(lèi)型的時(shí)候,先要選定一個(gè)特定的閾值量,比如:125,這樣,新的閾值產(chǎn)生規(guī)則可以解釋為大于125的像素點(diǎn)的灰度值設(shè)定為最大值(如8位灰度值最大為255),灰度值小于125的像素點(diǎn)的灰度值設(shè)定為0。
反二進(jìn)制閾值化1: THRESH_BINARY_INV ? ? -當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為0,否則設(shè)置為Maxval
-
該閾值類(lèi)型如下式所示:
-
解釋:該閾值化與二進(jìn)制閾值化相似,先選定一個(gè)特定的灰度值作為閾值,不過(guò)最后的設(shè)定值相反。(在8位灰度圖中,例如大于閾值的設(shè)定為0,而小于該閾值的設(shè)定為255)。
?
截?cái)嚅撝祷?2: THRESH_TRUNC ? ? ? ? ?-當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為閾值,否則不改變
-
該閾值化類(lèi)型如下式所示:
-
解釋:同樣首先需要選定一個(gè)閾值,圖像中大于該閾值的像素點(diǎn)被設(shè)定為該閾值,小于該閾值的保持不變。
-
(例如:閾值選取為125,那小于125的閾值不改變,大于125的灰度值(230)的像素點(diǎn)就設(shè)定為該閾值)。
閾值化為0?3: THRESH_TOZERO ? ? ? ? -當(dāng)前點(diǎn)值大于閾值時(shí),不改變,否則設(shè)置為0
-
該閾值類(lèi)型如下式所示:
-
解釋:先選定一個(gè)閾值,然后對(duì)圖像做如下處理:像素點(diǎn)的灰度值大于該閾值的不進(jìn)行任何改變;?像素點(diǎn)的灰度值小于該閾值的,其灰度值全部變?yōu)?。
反閾值化為0?4: THRESH_TOZERO_INV ? ? -當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為0,否則不改變
-
該閾值類(lèi)型如下式所示:
-
解釋:原理類(lèi)似于0閾值,但是在對(duì)圖像做處理的時(shí)候相反,即:像素點(diǎn)的灰度值小于該閾值的不進(jìn)行任何改變,而大于該閾值的部分,其灰度值全部變?yōu)?。
?
還有其他的常用:CV_THRESH_OTSU?大津閾值和自適應(yīng)閾值adaptiveThreshold
大津法OTSU(最大類(lèi)間方差法)
Otsu分割方法求取閾值是求得使類(lèi)間方差最大的閾值,Otsu方法加權(quán)地使用了兩類(lèi)的灰度均值信息和概率密度信息,考慮了兩類(lèi)的分布,在實(shí)際的應(yīng)用中取得了很好的效果
在實(shí)際運(yùn)用過(guò)程中,大津法表現(xiàn)得最穩(wěn)定,且無(wú)需參數(shù),對(duì)于現(xiàn)實(shí)圖像保持了最好的均勻性和形狀特性,而且被商業(yè)軟件GIMP 和學(xué)術(shù)軟件Matlab采納為自動(dòng)閾值法。
大津算法可以從圖像直方圖上有一個(gè)更為直觀的理解:大津閾值大致上是直方圖兩個(gè)峰值之間低谷的值。
Otsu 方法也不是萬(wàn)能的。當(dāng)目標(biāo)與背景的大小比例懸殊時(shí),類(lèi)間方差準(zhǔn)則函數(shù)可能呈現(xiàn)雙峰或多峰,此時(shí)效果不好。這時(shí)就要考慮其他的辦法了
示例代碼C++:
/************************************************************************/ /* OpenCV閾值分割函數(shù):threshold() 函數(shù)原型: double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type) 參數(shù)含義: InputArray src -原圖像 OutputArray dst -輸出圖像 double thresh -閾值大小 double maxval -最大值 int type -閾值模式 閾值模式有以下幾種類(lèi)型 0: THRESH_BINARY -當(dāng)前點(diǎn)值大于閾值時(shí),取Maxval,否則設(shè)置為0 1: THRESH_BINARY_INV -當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為0,否則設(shè)置為Maxval 2: THRESH_TRUNC -當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為閾值,否則不改變 3: THRESH_TOZERO -當(dāng)前點(diǎn)值大于閾值時(shí),不改變,否則設(shè)置為0 4: THRESH_TOZERO_INV -當(dāng)前點(diǎn)值大于閾值時(shí),設(shè)置為0,否則不改變 // CV_THRESH_MASK =7 CV_THRESH_OTSU =8 */ /************************************************************************/#include <opencv2\imgproc\imgproc.hpp> #include <opencv2\highgui\highgui.hpp> #include <iostream>using namespace cv; using namespace std;#define WINDOW_NAME "閾值處理"//定義滑動(dòng)條初始值 int g_nThresholdValue=100; //閾值初始值 int g_nThresholdType=0; //閾值模式初始值Mat g_srcImage,g_grayImage,g_dstImage;void on_Threshold(int ,void*);//回調(diào)函數(shù)int main() {g_srcImage=imread("dog.jpg");//讀入圖片if(!g_srcImage.data){cout<<"讀入錯(cuò)誤"<<endl;return -1;}//轉(zhuǎn)換為灰度圖cvtColor(g_srcImage,g_grayImage,COLOR_RGB2GRAY);//更多轉(zhuǎn)換方式參見(jiàn)官方文檔//顯示原圖imshow("原圖",g_srcImage);//大津閾值threshold(g_grayImage,g_dstImage,0,255,CV_THRESH_OTSU); //自適應(yīng)閾值//adaptiveThreshold(g_grayImage,g_dstImage,255,0,0,7,9);imshow(WINDOW_NAME,g_dstImage); waitKey();//創(chuàng)建滑動(dòng)條namedWindow(WINDOW_NAME);createTrackbar("模式",WINDOW_NAME,&g_nThresholdType,4,on_Threshold);createTrackbar("閾值",WINDOW_NAME,&g_nThresholdValue,255,on_Threshold);//使用回調(diào)函數(shù)顯示圖像on_Threshold(0,0);waitKey();return 0; }void on_Threshold(int,void*) {//進(jìn)行閾值分割threshold(g_grayImage,g_dstImage,g_nThresholdValue,255,g_nThresholdType);//顯示結(jié)果imshow(WINDOW_NAME,g_dstImage); }?
效果展示:
大津閾值:
?
其他基本類(lèi)型:
?
最大熵閾值分割
二維最大熵閾值分割原理
OpenCV - 區(qū)域生長(zhǎng)算法
?
文獻(xiàn)參考:
1.https://blog.csdn.net/xw20084898/article/details/22101323
2.http://www.cnblogs.com/Tang-tangt/p/9420405.html
?
總結(jié)
以上是生活随笔為你收集整理的OpenCV阈值分割的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vtkImageData处理之阈值分割
- 下一篇: 社交网络分析——信息传播模型(附带三个模