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

什么是阈值?

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

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

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

  • 一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。

    Threshold simple example

一、阈值操作的作用

       阈值操作属于像素级处理。在灰度图像中,每个像素都有一个灰度值,我们可以对灰度值设置阈值,像素与阈值比较,来实现对图像进行灰度较小和较大的噪声滤波处理,或者突出图像与背景的灰度差等等功能。

二、阈值函数 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(二进制阈值)

             \texttt{dst} (x,y) =  \fork{\texttt{maxVal}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

      THRESH_BINARY_INV(反二进制阈值)

               \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{maxVal}}{otherwise}

       THRESH_TRUNC(截断阈值)

               \texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

       THRESH_TOZERO(0阈值)

               \texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

       THRESH_TOZERO_INV(反0阈值)

              \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

       

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阈值)

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值