OpenCV學習心得(7) -- 閾值處理

轉載請注明出處與作者

OpenCV提供了2個函數來處理閾值.

第一個函數

double threshold(InputArray src, OutputArray dst, double thresh, double maxVal, int thresholdType);

這個函數是使用一個固定的值thresh來分割區間的.可以用來得到2值圖或者濾除噪聲.或者濾除一些很小或很大的值.

thresholdType有幾種類型可以選擇:

THRESH_BINARY 當src(x,y)>thresh時填充maxVal,否則填充0;

THRESH_BINARY_INV  當src(x,y)>thresh時填充0,否則填充maxVal;

THRESH_TOZERO 當src(x,y)>thresh時保留原值,否則填充0;

THRESH_TOZERO_INV  當src(x,y)>thresh時填充0,否則保留原值;


THRESH_TRUNC和THRESH_OTSU還沒有研究...待以後補充...


第二個函數,自動閾值

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C)

這個函數會根據條件對每一個點都計算出一個值,然後根據這個值來判斷最終要填充什麽值.

thresholdType有2個值可以選擇

THRESH_BINARY 當計算出的值>thresh時填充maxVal,否則填充0;

THRESH_BINARY_INV  當計算出的值>thresh時填充0,否則填充maxVal;

adaptiveMethod有2個值可以選擇

ADAPTIVE_THRESH_MEAN_C 使用平均加權的方式計算

ADAPTIVE_THRESH_GAUSSIAN_C 使用高斯函數進行計算.

參數C是一個數值,由adaptiveMethod方式計算出來的值要減去C才能得到最終的值.這個最終的值就是用來判斷要填充什麽值的.所以我們可以將這個值當做一個偏移量來使用.

參數blockSize表示計算的時候使用的矩陣大小,此參數必須是大於1的奇數,例如3,5,7....


類中的代碼:

	//!閾值: 將圖像轉換為高對比度的黑白圖像.此函數針對ROI進行處理.必須為單通道圖像
	//!invert為false時,大於thresh的值轉換為maxval,小於等於thresh的值轉換為0.invert為true時,大於thresh的值轉換為0,小於等於thresh的值轉換為maxval.
	bool Threshold(double thresh,double maxval,bool invert=false);
	//!invert為false時,大於thresh的值保留原值,小於等於thresh的值轉換為0.invert為true時,大於thresh的值轉換為0,小於等於thresh的值保留原值.
	bool Threshold(double thresh,bool invert=false);
	//!自適應閾值:以每一個點為中心取blocksize大小的矩陣,矩陣中的值求均值再減去valoffset得到一個最終的值,如果原值大於這個最終的值則填充maxval,否則填充0.
	//!invert為false時,大於最終值則填充maxval,小於等於最終值則填充0.invert為true時,大於最終值則填充0,小於等於最終值則填充maxval.
	//!useGaussionMode 為true的時候計算均值使用高斯函數進行計算,為false的時候使用平均加權法進行計算.
	//!blocksize: 為大於1的奇數,如3,5,7,....
	bool AdaptiveThreshold(double maxval,int blocksize,double valoffset, bool useGaussionMode=false,bool invert=false);


bool COpenCVImage::Threshold(double thresh,double maxval,bool invert)
{
	if(m_src.channels()!=1) return false;
	cv::threshold(m_src(r_roi),m_src(r_roi),thresh,maxval,invert?cv::THRESH_BINARY_INV:cv::THRESH_BINARY);
	m_modifyed_for_draw=true;
    return true;
}
bool COpenCVImage::Threshold(double thresh,bool invert)
{
	if(m_src.channels()!=1) return false;
	cv::threshold(m_src(r_roi),m_src(r_roi),thresh,0,invert?cv::THRESH_TOZERO_INV:cv::THRESH_TOZERO);
	m_modifyed_for_draw=true;
    return true;
}
bool COpenCVImage::AdaptiveThreshold(double maxval,int blocksize,double valoffset, bool useGaussionMode,bool invert)
{
	if(m_src.channels()!=1) return false;
	cv::adaptiveThreshold(m_src(r_roi),m_src(r_roi),maxval,
		(useGaussionMode?cv::ADAPTIVE_THRESH_GAUSSIAN_C:cv::ADAPTIVE_THRESH_MEAN_C),
		(invert?cv::THRESH_BINARY_INV:cv::THRESH_BINARY),blocksize,valoffset);
	m_modifyed_for_draw=true;
    return true;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值