阈值

函数 createTrackbar()

函数 threshold()

 

最简单的图像分割算法

应用举例:从一副图像中分离出我们需要的物体部分。这样的图像分割算法是基于图像中物体与

背景之间的灰度差异,而且,此分割属于像素级的分割。

为了从一副图像中提取出我们需要的部分,应该利用图像中每一个像素点的灰度值与选区的阈值进行比较,

做出相应判断。

一旦找到了需要分割物体的像素点,我们可以对这些像素点设定一些特定的值来表示(例如可以将物体的

像素点设置为0(黑色),其他像素点设置为25(白色))

阈值化的类型

OpenCV提供了阈值函数:threshold。

这个函数有5种阈值化类型。

为了了解阈值分割的过程,看一个简单有关像素灰度的图片。蓝色水平线代表一个具体的阈值。

二进制阈值化

dst(x,y)=maxVal       if src(x,y)>thresh

             0                 otherwise

运用该阈值时,先设定一个特定的阈值量,比如:125,大于125的像素点设置为最大值,小于

125的像素点设置为最小值。

反二进制阈值化

dst(x,y)=0                  if src(x,y)>thresh

              maxVal        otherwise

与二进制阈值化相似,不过结果设定相反。

截断阈值化

dst(x,y)=threshold   if src(x,y)>thresh

              src(x,y)       otherwise

首先选定一个阈值,图像中大于该阈值的像素点倍设置为该阈值,小于该阈值的保持不变。

阈值化为0

dst(x,y)=src(x,y)      if src(x,y)>thresh

              0                otherwise

先设定一个阈值,对图像做如下处理,1.像素点的灰度值大于该阈值点的不做任何改变,

像素点的灰度值小于该阈值的,其灰度值全变为0。

反阈值化为0

dst(x,y)=0            if src(xy)>thresh

              src(x,y)  otherwise

先设定一个阈值,对图像做如下处理,1.像素点的灰度值大于该阈值点的变为0,

2.像素点的灰度值小于该阈值的,不做任何改变

#include <opencv2/opencv.hpp>
#include <iostream>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;

//全局变量定义及赋值

int threshold_value = 0;
int threshold_type = 1;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;

Mat src, src_gray, dst;
char* window_name = (char* )"Threshold Demo";
char* trackbar_type =(char* ) "Type:\n 0: Binary \n 1:Binary Inverted \n 2:Truncate \n 3:To Zero\n 4:To Zero Inverted";
char* trackbar_value = (char*)"Value";
//自定义函数声明
void Threshold_Demo(int, void*);



int main()
{
    src = imread("D:\\Pic\\4141.jpg");  //存放自己图像的路径 
    if (!src.data) {
        printf("No data! --Exiting the program\n");
        return -1;
    }
    //将图片转换称灰度图片
    cvtColor(src, src_gray, CV_RGB2GRAY);

    //创建一个窗口显示图片
    namedWindow(window_name, CV_WINDOW_AUTOSIZE);

    //创建滑动条来控制阈值
    createTrackbar(trackbar_type,
        window_name,
        &threshold_type,
        max_type,
        Threshold_Demo);

    createTrackbar(trackbar_value,
        window_name,
        &threshold_type,
        max_value,
        Threshold_Demo);

    //初始化自定义的阈值函数
    Threshold_Demo(0, 0);
    
    //等待用户按键,如果是ESC则退出等待过程
    while (true) {
        int c;
        c = waitKey(20);
        if ((char)c == 20) {
            break;
        }
    }
    system("pause");
    return 0;
}

//自定义的阈值函数
void Threshold_Demo(int, void*) {
    /*
    0:二进制阈值,
    1:反二进制阈值,
    2:截断阈值,
    3:0阈值,
    4:反0阈值
    */
    threshold(src_gray, dst,threshold_value, max_BINARY_value, threshold_type);
    imshow(window_name, dst);
}

 

posted on 2018-09-29 00:15  zuoyou  阅读(531)  评论(0编辑  收藏  举报