OpenCV 基本阈值操作

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 基本阈值操作相关的知识,希望对你有一定的参考价值。

图像阈值

阈值是什么?

简单点说是把图像分割的标尺

例如:从一副图像中利用阈值分割出我们需要的物体部分。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。

为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。

一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。

具体示例如:在PS中的阈值,实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑(可以跟滤镜中的其它――高反差保留,再用阈值效果会更好)。

阈值类型

(解释说明:以下五种类型,左图皆为转化前像素值柱形图,中间为转化公式,右图为转化后像素值柱形图)

阈值二值化(threshold binary)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值

解释:在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。

阈值反二值化(threshold binary Inverted)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值

解释:该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。

截断 (truncate)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值

解释:同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。

阈值取零 (threshold to zero)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值


解释:先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。

阈值反取零 (threshold to zero inverted)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值

解释:原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。

API:threshold函数

OpenCV中的阈值(threshold)函数:

函数原型:

threshold(img, threshold, maxval,type)

参数说明:

  • threshold:是设定的阈值
  • maxval:是当灰度值大于(或小于)阈值时将该灰度值赋成的值
  • type:规定的是当前二值化的方式

代码演示

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  

using namespace cv;
using namespace std;

/// 全局变量定义及赋值

int threshold_value = 160;
int threshold_type = 3;;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;

Mat src, src_gray, dst;
char* window_name = "Threshold Demo";

char* trackbar_type = "Type";
char* trackbar_value = "Value";

/// 自定义函数声明
void Threshold_Demo(int, void*);

int main(int argc, char** argv)

	/// 读取一副图片,不改变图片本身的颜色类型(该读取方式为DOS运行模式)
	src = imread("./test1.jpg");

	/// 将图片转换成灰度图片
	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_value,
		max_value, Threshold_Demo);

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

	/// 等待用户按键。如果是ESC健则退出等待过程。
	while (true)
	
		int c;
		c = waitKey(20);
		if ((char)c == 27)
		
			break;
		
	



// 自定义的阈值函数
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);

以上是关于OpenCV 基本阈值操作的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV之基本阈值操作

OpenCV之基本阈值操作

OpenCV之基本阈值操作

opencv学习-基本阈值操作

OpenCV基于cv2的图像阈值化处理超详细的注释和解释掌握基本操作

基于 OpenCV 实战:对象跟踪