Opencv学习之阈值化处理

  阈值可以被视作最简单的图像分割方法这样的图像分割方法基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。

固定阈值操作–threshold()函数–单通道数组

double threshold(inoutArray,outputArray,double thresh,double maxval,int type)
*第一个参数,输入图像,单通道,8或32位浮点类型的Mat。
*第二个参数,输出图像。
*第三个参数,阈值的具体值。
*第四个参数,当第五个参数阈值类型type取CV_THRESH_BINARY或CV_THRESH_BINARY_INV阈时阈值类型时的最大值。
*第五个参数,阈值类型,int type
(1)0,CV_THRESH_BINARY:二值阈值化
(2)1,CV_THRESH_BINARY_INV:反向二值阈值化并反转
(3)2,CV_THRESH_TRUNC:截断阈值化
(4)3,CV_THRESH_TOZERO_INV:超过阈值被置为0
(5)4,CV_THRESH_TOZERO:低于阈值被置为0

自适应阈值操作–adaptiveThreshold()函数–矩阵

void adaptiveThreshold(inputArray,outputArray,double maxVal,int adaptiveMethod,int thresholdType,int blockSize,double C)
*第一个参数,输入图像,8位单通道浮点型图像。
*第二个参数,输出图像。
*第三个参数,给像素赋的满足条件的非零值。
*第四个参数,用于指定要使用的自适应阈值算法,ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C。
*第五个参数,阈值类型,THRESH_BINARY,THRESH_BINARY_INV其中之一。
*第六个参数,用于计算阈值大小的一个像素的邻域尺寸,取值为3、5、7等。
*第七个参数,减去平均或加权平均值后的常数值,通常其为正数,但少数情况下也可以为零或负数。

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace cv;
using namespace std;

#define WINDOW_NAME "[Procedure Window]"

//全局变量声明
Mat g_srcImage,g_dstImage,g_grayImage;
int g_nThresholdType=0;//0为二进制阈值,1为反二进制阈值,2为截断阈值,3为阈值化为0,4为反阈值化为0,5为均匀自适应阈值,6为高斯自适应阈值
int g_nThresholdValue=100;

//全局函数声明部分
void on_Threshold(int ,void *);
//主函数
int main()
{
    //载入源图像
    g_srcImage=imread("/Users/new/Desktop/1.jpg");
    if(!g_srcImage.data){printf("读取源图像srcImage错误~!\n");return false;}
    //灰度图像
    cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
    //创建窗口并显示源图像
    namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);

    //滑动条来控制阈值和模式
    createTrackbar("mode:", WINDOW_NAME, &g_nThresholdType, 6,on_Threshold);
    createTrackbar("parameters:", WINDOW_NAME, &g_nThresholdValue, 255,on_Threshold);

    //初始化自定义的阈值回调函数
    on_Threshold(0,0);

    //轮询等待用户案件,如果按下ESC键则退出程序
    while(1)
    {
        int key;
        key= waitKey(20);
        if((char)key==27){break;}
    }
}

//自定义的阈值回调函数
void on_Threshold(int,void *)
{
    switch(g_nThresholdType)
    {
        case 5:
            adaptiveThreshold(g_grayImage, g_dstImage, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, 5);
            break;
        case 6:
            adaptiveThreshold(g_grayImage, g_dstImage, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 5);
            break;
        default:
            threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
    }
    imshow(WINDOW_NAME,g_dstImage);
}

原始图片:
这里写图片描述

固定阈值-二进制阈值:
这里写图片描述

固定阈值-反二进制阈值:
这里写图片描述

固定阈值-截断阈值:
这里写图片描述

固定阈值-反阈值化为0:
这里写图片描述

固定阈值-阈值化为0:
这里写图片描述

自适应阈值-均匀:
这里写图片描述

自适应阈值-高斯:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值