2.5基本的阈值操作
Posted zuoyou151
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.5基本的阈值操作相关的知识,希望对你有一定的参考价值。
阈值
函数 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: 0: Binary 1:Binary Inverted 2:Truncate 3:To Zero 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 "); 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); }
以上是关于2.5基本的阈值操作的主要内容,如果未能解决你的问题,请参考以下文章