什么是阈值
阈值又叫临界值,是指一个效应能够产生的最低值或最高值。实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑。从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值)。
阈值化分类
二进制阈值化
处理方案
效果图
运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。
反二进制阈值化
处理方案
效果图
该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。
截断阈值化
处理方案
效果图
同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。
阈值化为0
处理方案
效果图
先选定一个阈值,然后对图像做如下处理:像素点的灰度值大于该阈值的不进行任何改变;像素点的灰度值小于该阈值的,其灰度值全部变为0。
反阈值化为0
处理方案
效果图
阈值操作函数
double threshold( InputArray src, OutputArray dst,double thresh, double maxval, int type );
/*******************************************************************
* src: 输入图像
* dst: 输出图像
* thresh: 阈值的具体值
* maxval: 阈值的最大值
* type: 阈值操作类型
*********************************************************************/
//阈值操作类型
enum ThresholdTypes {
THRESH_BINARY = 0, //二进制
THRESH_BINARY_INV = 1, //反二进制
THRESH_TRUNC = 2, //截断
THRESH_TOZERO = 3, //阈值化为0
THRESH_TOZERO_INV = 4, //反阈值化为0
THRESH_MASK = 7, //自适应阈值
THRESH_OTSU = 8, //利用最大类间方差法(OTSU)求出对图像进行二值化处理的最佳阈值
THRESH_TRIANGLE = 16 //三角算法选择最优阈值
};
综合代码
#include <iostream>
#include <map>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Threshold
{
public:
Threshold() :img(imread("test.jpg"))
{
result["原图"] = img;
}
void Show()
{
for (auto& v : result)
{
imshow(v.first, v.second);
}
waitKey(0);
}
void Testthreshold()
{
threshold(img, result["二进制"], 125, 188, THRESH_BINARY);
threshold(img, result["反二进制"], 125, 188, THRESH_BINARY_INV);
threshold(img, result["截断"], 125, 188, THRESH_TRUNC);
threshold(img, result["阈值化为0"], 125, 188, THRESH_TOZERO);
threshold(img, result["反阈值化为0"], 125, 188, THRESH_TOZERO_INV);
//threshold(img, result["自适应"], 125, 188, THRESH_MASK);
//threshold(img, result["最大类间方差法"], 125, 255, THRESH_OTSU);
//threshold(img, result["三角算法"], 125, 255, THRESH_TRIANGLE);
}
private:
Mat img;
map<string, Mat> result;
};
int main()
{
Threshold* pthresh = new Threshold;
pthresh->Testthreshold();
pthresh->Show();
return 0;
}