OpenCV 基本阈值操作

简介: 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);
}
相关文章
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
35 0
|
5月前
|
存储 Cloud Native Linux
OpenCV 图像像素运算操作
OpenCV 图像像素运算操作
|
4月前
|
计算机视觉 Python
OpenCV膨胀操作讲解及将图像加工成近视眼效果实战(附Python源码)
OpenCV膨胀操作讲解及将图像加工成近视眼效果实战(附Python源码)
29 0
|
3月前
|
计算机视觉 Python 索引
【Python Opencv】图片与视频的操作
【Python Opencv】图片与视频的操作
【Python Opencv】图片与视频的操作
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
31 0
|
4月前
|
机器学习/深度学习 算法 计算机视觉
python入门(六) opencv的安装,图片操作,绘制文字图形,视频操作
python入门(六) opencv的安装,图片操作,绘制文字图形,视频操作
|
4月前
|
编解码 计算机视觉 Python
OpenCV保存摄像头视频和视频文件操作实战(附Python源码)
OpenCV保存摄像头视频和视频文件操作实战(附Python源码)
232 0
|
4月前
|
计算机视觉 Python
OpenCV腐蚀操作讲解及抹除仙人球上的刺实战(附Python源码)
OpenCV腐蚀操作讲解及抹除仙人球上的刺实战(附Python源码)
39 0
OpenCV腐蚀操作讲解及抹除仙人球上的刺实战(附Python源码)
|
4月前
|
计算机视觉 Python
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
99 0
|
4月前
|
数据安全/隐私保护 计算机视觉 开发者
OpenCV中使用NumPy模块操作像素讲解及实战(附源码 超详细)
OpenCV中使用NumPy模块操作像素讲解及实战(附源码 超详细)
39 0
OpenCV中使用NumPy模块操作像素讲解及实战(附源码 超详细)