您的位置:首页 > 运维架构

(学习笔记)threshold —— opencv阈值操作

2017-09-29 14:41 706 查看



什么是阈值?

最简单的图像分割的方法。

应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。

为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。

一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘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阈值)

              


       



cvThreshold是opencv库中的一个函数。作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 threshold_type
确定。

形式: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阈值)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: