(学习笔记)threshold —— opencv阈值操作
2017-09-29 14:41
706 查看
什么是阈值?
最简单的图像分割的方法。应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。
为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。
一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/Threshold_Tutorial_Theory_Example.jpg)
一、阈值操作的作用
阈值操作属于像素级处理。在灰度图像中,每个像素都有一个灰度值,我们可以对灰度值设置阈值,像素与阈值比较,来实现对图像进行灰度较小和较大的噪声滤波处理,或者突出图像与背景的灰度差等等功能。
二、阈值函数 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(二进制阈值)![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/78fda905d5dd8210a01906247514a67d8763407c.png)
THRESH_BINARY_INV(反二进制阈值)
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/86b664329c208ff89854226e992d9e9f3f6a0697.png)
THRESH_TRUNC(截断阈值)
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/0f3cd4f2207fe9992e698c2699d7953453934874.png)
THRESH_TOZERO(0阈值)
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/71183c69df0d555b0498c6d42e846f438e47b179.png)
THRESH_TOZERO_INV(反0阈值)
![](http://www.opencv.org.cn/opencvdoc/2.3.2/html/_images/math/2c112979b15dafc432c64bd20405ae2b3e64f149.png)
确定。
形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。
dst:输出数组,必须与 src 的类型一致,或者为 8-bit。
threshold:阈值
max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:
如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,des(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV:
如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
threshold_typ
在这里一定要注意dst必须是单通道的图像,本人之前写成3通道图像,一直出错,检查了好久才发现问题所在。这说明还是要细心。
四、例程和程序结果分析
#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阈值)
相关文章推荐
- Python OpenCV学习笔记之:图像阈值操作
- opencv学习笔记--基本阈值操作
- opencv学习笔记(二十一)——阈值操作
- opencv学习(二十八)之基本图像阈值操作threshold
- Opencv学习笔记(四)--图像处理平滑,锐化操作
- OpenCV学习笔记_用指针操作图像元素
- OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年
- openCV学习笔记(四):图像遍历和像素操作
- OpenCV学习笔记(四) Mat的简单操作
- OpenCV2学习笔记(一) 图像的基本操作
- 我的OpenCV学习笔记(16):利用工具条调用基本的形态学操作
- openCV Python 学习笔记(一)图像的基本操作
- Opencv 学习笔记之——鼠标,进度条操作
- openCV学习笔记(二)---openCV系列基本操作(2)
- OpenCV学习笔记二:操作像素
- opencv2学习笔记2-操作图像(椒盐噪声)
- OpenCV学习笔记6-图像的基础操作
- OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
- OpenCV 2 学习笔记(23): 开操作与闭操作
- OpenCV(C++接口)学习笔记2-像素级的图像操作