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
原创粉丝点击