可以调节的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("1.png");
    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);
}

猜你喜欢

转载自blog.csdn.net/csdn_dzh/article/details/79214000