什么是阈值?
-
最简单的图像分割的方法。
-
应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。
-
为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。
-
一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。
一、阈值操作的作用
阈值操作属于像素级处理。在灰度图像中,每个像素都有一个灰度值,我们可以对灰度值设置阈值,像素与阈值比较,来实现对图像进行灰度较小和较大的噪声滤波处理,或者突出图像与背景的灰度差等等功能。
二、阈值函数 threshold 介绍
头文件: #include <opencv2/imgproc/imgproc.hpp>
函数定义:
//! applies fixed threshold to the image
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
函数参数介绍:
InputArray src, 源图像
OutputArray dst, 输出图像
double thresh, 门限值
double maxval, 最大值
int type, 函数类型选择,THRESH_BINARY,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV
三、函数类型选择
THRESH_BINARY(二进制阈值)
THRESH_BINARY_INV(反二进制阈值)
THRESH_TRUNC(截断阈值)
THRESH_TOZERO(0阈值)
THRESH_TOZERO_INV(反0阈值)
四、例程和程序结果分析
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <string>
using namespace cv;
void main()
{
cv::Mat image = imread("threshold.jpg");
cv::namedWindow("original");
cv::imshow("original",image);
string windowstring = "result 0";
string imagestring = "result 0.jpg";
cv::Mat result;
enum thresholdtype{THRESH_BINARY ,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV};
for (int thresh = 0;thresh<5;thresh++)
{
/* 0: 二进制阈值
1: 反二进制阈值
2: 截断阈值
3: 0阈值
4: 反0阈值
*/
threshold(image,result,150,255,thresholdtype(thresh));//改变参数实现不同的threshold
cv::namedWindow(windowstring);
cv::imshow(windowstring,result);//显示输出结果
cv::imwrite(imagestring,result);
windowstring[7]++;
imagestring[7]++;
}
waitKey(0);
}
程序结果:
threshold.jpg(源图像)
THRESH_BINARY(二进制阈值)
THRESH_BINARY_INV(反二进制阈值)
THRESH_TRUNC(截断阈值)
THRESH_TOZERO(0阈值)
THRESH_TOZERO_INV(反0阈值)