天天看点

opencv--阈值

全局阈值

threshold 方法是通过遍历灰度图中点,将图像信息二值化,处理过后的图片只有二种色值。

其函数原型如下:

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
           

参数信息:

第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。

第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。

第三个参数,double类型的thresh,阈值的具体值。

第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.

第五个参数,int类型的type,阈值类型,。

其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型

0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0

1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval

2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变

3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0

4: THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变

官方解释如下图:

opencv--阈值

下面是简单应用实例代码片段

int main(){
    int nY20_thresh=96;

    int nY20_MaxThesh=255;

    void _onY20thresh(int,void*){

    Mat src;

    m_Mat.copyTo(src);


    Mat dst,edge,gray;


    // 【1】创建与src同类型和大小的矩阵(dst)

    dst.create( src.size(), src.type() );


    // 【2】将原图像转换为灰度图像

    cvtColor( src, gray, CV_BGR2GRAY );


    // 【3】先用使用 3x3内核来降噪

    blur( gray, edge, Size(3,3) );


    //type选THRESH_BINARY,大于阈值的设置为maxval(255),其它置0

    threshold(edge, dst, nY20_thresh, 255, THRESH_BINARY);



    CVShow("threshold二值化灰图",dst,400,400);



}
           

效果如下:

opencv--阈值

自适应阈值

在图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域背景区域,仅仅通过设定固定阈值很难达到理想的分割效果。在实践应用中,目标及背景区域通常相互依存在图像块中,我们可以通过图像像素领域快的分布特征来自适应确定阈值的二值化阈值。对于图像块中亮度变化明显的区域,自适应阈值通常会设置的比较大或者比较小,进而保证图像中各个像素的阈值会随着周围领域的变化而变化。

opencv中提供了自适应阈值化函数adaptiveThreshold,该函数有两种自适应阈值化类型参数可供选择,用来对当前像素点与领域像素块进行阈值计算。

void adaptiveThreshold(InoutArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C)

实现图像的自适应阈值化操作。参数src表示源图像数组(单通道8位图像)。参数dst表示输出图像组(与输入图像同样的尺寸和类型)。参数maxVal表示预示满足条件的最大值。参数adaptiveMethod表示自适应阈值算法选择ADAPTIVE_THRESHOLD_MEAN_C或者ADAPTIVE_THRESHOLD_GAUSSIAN_C。参数thresholdType表示阈值类型THRESHOLD_BINARY和THRESHOLD_BINARY_INV。参数blockSize表示领域块的大小,用来计算区域阈值,一般选择3、5、7............。参数C表示常数,它是一个从均值或者加权均值提取的常数,可以是负数。

代码如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <string>


using namespace std;
using namespace cv;


int main()
{
cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");

if(srcImage.empty())
{ 
return-1;
}

cv::imshow("原图像", srcImage);

//灰度转换
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
cv::imshow("srcGray", srcGray);

cv::Mat dstImage;

//初始化自适应阈值参数
int blockSize =5;
int constValue =20;
int maxValue =255;

//自适应阈值算法0:ADAPTIVE_THRESHOLD_MEAN_C,1:ADAPTIVE_GAUSSIAN_MEAN_C
//阈值类型,0:THRESHOLD_BINARY,1:THRESHOLD_BINARY_INV
int adaptiveMthod =0;
int thresholdType =1;

//图像自适应阈值操作
cv::adaptiveThreshold(srcGray, dstImage, maxValue, adaptiveMthod, thresholdType, blockSize, constValue);
cv::imshow("dstImage", dstImage);

cv::waitKey(0);

//预设最大值
const int maxVal =255;

return 0;
}