OpenCV中阈值操作
来源:互联网 发布:广电网络用什么机顶盒 编辑:程序博客网 时间:2024/05/19 02:27
阈值分割,顾名思义,就是对图像的像素点和选中的阈值进行比对的图像分割方法,在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;}
0 0
- OpenCV中阈值操作
- opencv-基础阈值操作
- OpenCV--基本阈值操作
- opencv图像的阈值操作
- OpenCV基本的阈值操作
- opencv 阈值操作类型选择
- OpenCV 阈值化操作cvThreshold 和 自适应阈值cvAdaptiveThreshold操作
- opencv中阈值函数处理
- 【OpenCV笔记 11】OpenCV中基本阈值化操作函数threshold()
- threshold —— opencv阈值操作
- OpenCV学习笔记(2): 基本阈值操作
- 【opencv练习18 - 基本阈值操作】
- C/C++ OpenCV图像的阈值操作
- opencv学习笔记--基本阈值操作
- 【拜小白opencv】23-双阈值化操作
- 【拜小白opencv】24-半阈值化操作
- opencv学习笔记—8,阈值操作
- 【拜小白opencv】25-综合示例——8种阈值化操作【OTSU阈值化、自适应阈值化、二进制阈值化、反二进制阈值化、截断阈值化、阈值化为0、反阈值化为0,双阈值化】
- 【软件工程】-软件生存期模型
- 实现安卓日夜间模式切换
- mp4文件格式简明教程-mp4文件格式通俗解释
- linux 远程连接oracle 安装instantclient简易客户端
- 词法分析器的实现
- OpenCV中阈值操作
- org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupportedWARNING: Request met
- quickselect算法
- 【备忘】Dubbo与Zookeeper视频教程分布式架构+第三方支付
- android卡片式布局
- ZCA白化(协方差矩阵变换成单位矩阵)和数据零均值处理
- Twemproxy代理Redis-cluster
- sed 匹配最短模式的方法
- 前端代码规范V1.0