阈值分割,顾名思义,就是对图像的像素点和选中的阈值进行比对的图像分割方法,在OpenCV 2.X中,Threshold()函数(基本阈值操作)和adaptiveThreshold()函数(自适应阈值操作)可以完成图像阈值分割的目的。基本思想是:给定一个数组和一个阈值,根据数组中的每个元素值是高于还是低于阈值而进行一些处理。

1.固定阈值操作:Threshold()函数

       Threshold()函数对单通道数组应用固定阈值操作,该函数的典型应用是对灰度图像进行阈值操作得到二值图像,(compare()函数也可以达到此目的)或者是去掉噪声,例如过滤很小或者很大像素值的图像点
  C++:double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type)
            参数一:输入数组,单通道,8或者32位浮点类型的Mat即可
            参数二:和第一个参数中的Mat变量有一样的尺寸和类型。
            参数三:阈值的具体值
            参数四:double 类型的maxval,当第五个参数阈值类型type取CV_THRESHOLD_BINARY或者                                                     CV_THRESHOLD_BINARY_INV时阈值类型时的最大值 。
            参数五:阈值类型,threshold()函数支持的对图像取阈值的方法由下面确定:
                                   
      上述标识符一次取值为0,1,2,3,4.
示例如下:

// threshold.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>using namespace std;
using namespace cv;#define  WINDOW_NAME "[程序窗口]"   //为窗口标题定义的宏int g_nThresholdValue = 100;
int g_nThresholdType  = 3;
Mat srcImage,grayImage,dstImage;//全局函数声明
void on_Threshold(int,void*);//回调函数int _tmain(int argc, _TCHAR* argv[])
{srcImage = imread("1.jpg");if(!srcImage.data){printf("图片读取失败!\n");return false;}imshow("[源图像]",srcImage);//保留一份原图的灰度图cvtColor(srcImage,grayImage,COLOR_RGB2GRAY);//创建窗口并显示原始图namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);//创建滑动条来控制阈值createTrackbar("模式",WINDOW_NAME,&g_nThresholdType,4,on_Threshold);createTrackbar("参数值",WINDOW_NAME,&g_nThresholdValue,255,on_Threshold);//初始化自定义的阈值回调函数on_Threshold(0,0);waitKey();return 0;
}void on_Threshold(int,void*)
{//调用阈值函数threshold(grayImage,dstImage,g_nThresholdValue,255,g_nThresholdType);//更新效果图imshow(WINDOW_NAME,dstImage);
}

效果图:

 2.自适应阈值操作:adaptiveThreshold()函数
 
          adaptiveThreshold()函数的作用是对矩阵采用自适应阈值操作,支持就地操作
C++:void adaptiveThreshold(InputArray src,OutputArray dst,double maxValue,int adaptiveMethod,int thresholdType,int blockSize,double C)
          
         参数一:源图像,Mat类对象即可,需要是8位单通道浮点型图像
         参数二:需要和源图像有一样的尺寸和类型
         参数三:给像素赋的满足条件的非零值
         参数四:用于指定要使用的自适应阈值算法,取值为:ADAPTIVE_THRESH_MEAN_C或者                                                      ADAPTIVE_THRESH_GAUSSIAN_C
         参数五:阈值类型,取值为THRESH_BINARY,THRESH_BINARY_INV其中之一
         参数六:用于计算阈值大小的一个像素的邻域尺寸,取值为3,5,7.等
         参数七:减去平均或者加权平均后的常数值,通常为正数,但少数情况下也可以为0或者负数。
adaptiveThreshold()函数根据如下公式,将一副图像变换为一副二值图像。
  当参数五的"阈值类型"thresholdType"取值为THRESH_BINARY时,公式如下:
                                                   
 当参数五的"阈值类型"thresholdType"取值为THRESH_BINARY_INV时,公式如下:
                                                  
而其中的T(x,y) 为分别计算每个单独像素值的阈值,取值如下:
  • 对于 ADAPTIVE_THRESH_MEAN_C 的方法,阈值T(x,y) 为blockSize * blockSize 邻域内(x,y) 减去第七个参数 C 的平均值
  • 对于 ADAPTIVE_THRESH_GAUSSIAN_C 的方法,阈值T(x,y) 为blockSize * blockSize 邻域内(x,y) 减去第七个参数 C 与高斯窗交叉相关的加权总和。
#include "stdafx.h"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>using namespace std;
using namespace cv;
int main(int argc, char** argv)
{Mat image = imread("1.jpg");Mat grayImage;cvtColor(image,grayImage,COLOR_RGB2GRAY);if (image.empty()){cout << "read image failure" << endl;return -1;}// 局部二值化int blockSize = 7;int constValue = 11;Mat local;adaptiveThreshold(grayImage, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);imshow("[源图像]", image);imshow("localThreshold", local);waitKey(0);return 0;
}

OpenCV中阈值操作相关推荐

  1. OpenCV 基本阈值操作Thresholding Operations

    OpenCV 基本阈值操作Thresholding Operations 基本阈值操作Thresholding Operations 目标 门槛? 阈值类型 阈值二进制 阈值二进制,反转 截短 阈值为 ...

  2. OpenCV中视频操作及人脸识别案例

    目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...

  3. 【OpenCv】阈值操作(超详细)

    一.阈值化操作 1.阈值滑动条: createTrackbar使用方法及步骤 第一个参数:conststring& trackbarname,表示轨迹条的名字 第二个参数:conststrin ...

  4. opencv中直方图操作

    直方图 1 灰度直方图 1.1 原理 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中.其中, bin为直方图中经常用到的一个概念,可以译为"直条&quo ...

  5. OpenCV 基本阈值操作

    文章目录 图像阈值 阈值是什么? 阈值类型 阈值二值化(threshold binary) 阈值反二值化(threshold binary Inverted) 截断 (truncate) 阈值取零 ( ...

  6. 三天学会opencv(十三)——阈值操作

    基本阈值操作 主要内容 图像阈值 阈值类型 图像阈值(threshold) 阈值类型一阈值二值化(threshold binary) 图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值 我 ...

  7. OpenCV中图像形态学操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...

  8. OpenCV中感兴趣区域的选取与检测(一)

    1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据RO ...

  9. Python OpenCV 图片模糊操作 blur 与 medianBlur

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 函数原型介绍 均值模糊 中值模糊 2D 卷积(图像滤波),自定义模糊 橡皮擦的小 ...

最新文章

  1. 九、中缀表达式转为后缀表达式
  2. SBO应用技术一则-格式化
  3. vc2005编译ffmpeg以及ffplay
  4. UITabBarController 笔记(三) UITabBarController 配合 UINavigationController 的使用
  5. gophp解释器_对比平台--Go和PHP之间的区别
  6. plesk 打不开php,Laravel在Plesk背后,遇到PHP版本困难
  7. C#通过Redis实现分布式锁
  8. matlab vs2010编译器xml,如何在MATLAB R2010a 中使用Visual C++ 2010编译器
  9. idea社区版下载lombok或是导入lombok.jar包
  10. 请解释python面向对象中的继承
  11. 求一个二维数组的最大子矩阵的和
  12. JavaScript(第七天)【对象和数组】
  13. named-config with name ‘c3p0-config.xml‘ does not exist. Using default-config
  14. 这三款曾红极一时的软件,现已风光不再,而遭嫌弃的它成了香饽饽
  15. 视频修复工具修复损坏avi视频文件
  16. 产品更新|用于语音压缩的新型极低比特率编解码器,Lyra 长什么样?
  17. Groovy - Groovy ambiguous method overload
  18. Codeforces Problem-69A Young Physicist
  19. 【VUE+Elemet 】最全正则验证 + 表单验证 + 注意事项
  20. 如何让电脑的多个蓝牙音响同时输出声音

热门文章

  1. Java中的三目运算符
  2. WordPress-基础设置之固定链接设置
  3. win7系统控制面板下的打开或关闭windows功能需要打开哪些功能
  4. Nano PC ubuntu13.10 源
  5. sql getdate() 时间格式设置
  6. Linux 初始化之 Systemd机制
  7. _tcscpy_s函数引发的问题
  8. 百度超级链XChain(4)核心数据结构
  9. 微众WeCross 跨链平台(3)交易流程
  10. 1365. 有多少小于当前数字的数字(哈希表)