作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處
函數(shù)原型
double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
參數(shù)說明
- InputArray類型的src,輸入圖像。
- OutputArray類型的dst,輸出圖像。
- double類型的thresh,閾值的具體值。
- double類型的maxval,閾值最大值。
- int類型的type,閾值操作的類型,0為THRESH_BINARY(標(biāo)準(zhǔn)的二值化閾值法,大于thresh的設(shè)為maxval,小于的設(shè)為0),1為THRESH_BINARY_INV(反向二值化),2為THRESH_TRUNC(截?cái)嚅撝捣?#xff0c;大于thresh的設(shè)為thresh,小于則不變),3為THRESH_TOZERO(零化閾值法,大于thresh的不變,小于則零化),4為THRESH_TOZERO_INV(反向零化),7為THRESH_MASK(沒測(cè)試出來什么用法,都是黑屏),8為THRESH_OTSU(大津算法,適合雙峰直方圖的圖像,通過分析最大的背景前景類間方差,自動(dòng)調(diào)節(jié)閾值),16為THRESH_TRIANGLE(三角法,適合單峰直方圖圖像,建立谷底和峰頂直線,距離直線垂直距離最大的直方圖位置,即閾值thresh)。
測(cè)試代碼
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;
int main()
{
cv::Mat src = imread("test.jpg", 0);
cv::Mat th1,th2,th3,th4,th5;
// 最大類間差法,也稱大津算法
threshold(src, th1, 0, 255, THRESH_OTSU);
// 常規(guī)閾值分割法
threshold(src, th2, 100, 255, THRESH_BINARY);
// 截?cái)嚅撝捣指罘?threshold(src, th3, 80, 255, THRESH_TRUNC);
// 零化閾值分割法
threshold(src, th4, 100, 255, THRESH_TOZERO);
// 三角法
threshold(src, th5, 0, 255, THRESH_TRIANGLE);
imshow("original", src);
imshow("otsu", th1);
imshow("binary", th2);
imshow("trunc", th3);
imshow("zero", th4);
imshow("triangle", th5);
waitKey(0);
return 0;
}
測(cè)試效果
? ? ? ?一般來說,opencv提供的閾值函數(shù)可以適用大多數(shù)場景,針對(duì)特殊場景,可以根據(jù)自身需求自行設(shè)計(jì)閾值算法。另外,大津算法針對(duì)圖像灰度接近的場景挺有效的,用其他算法可能無法精確分離;三角法在圖像對(duì)比度較大的場景比較好用,可以較好地識(shí)別出目標(biāo)區(qū)域,但是這個(gè)區(qū)域可能偏大些,一般配合邊緣漸變算法使邊緣平滑過渡~
? ? ? ?如果文章幫助到你了,可以點(diǎn)個(gè)贊讓我知道,我會(huì)很快樂~加油!