您的位置:首页 > 运维架构

opencv自适应阈值

2017-05-30 23:11 246 查看
在图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域背景区域,仅仅通过设定固定阈值很难达到理想的分割效果。在实践应用中,目标及背景区域通常相互依存在图像块中,我们可以通过图像像素领域快的分布特征来自适应确定阈值的二值化阈值。对于图像块中亮度变化明显的区域,自适应阈值通常会设置的比较大或者比较小,进而保证图像中各个像素的阈值会随着周围领域的变化而变化。

opencv中提供了自适应阈值化函数adaptiveThreshold,该函数有两种自适应阈值化类型参数可供选择,用来对当前像素点与领域像素块进行阈值计算。

void adaptiveThreshold(InoutArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C)

实现图像的自适应阈值化操作。参数src表示源图像数组(单通道8位图像)。参数dst表示输出图像组(与输入图像同样的尺寸和类型)。参数maxVal表示预示满足条件的最大值。参数adaptiveMethod表示自适应阈值算法选择ADAPTIVE_THRESHOLD_MEAN_C或者ADAPTIVE_THRESHOLD_GAUSSIAN_C。参数thresholdType表示阈值类型THRESHOLD_BINARY和THRESHOLD_BINARY_INV。参数blockSize表示领域块的大小,用来计算区域阈值,一般选择3、5、7............。参数C表示常数,它是一个从均值或者加权均值提取的常数,可以是负数。

代码如下:

#include
"opencv2/highgui/highgui.hpp"


#include
"opencv2/imgproc/imgproc.hpp"


#include
"opencv2/opencv.hpp"


#include
"opencv2/core/core.hpp"


#include
<stdio.h>


#include
<string>






using
namespace std;


using
namespace cv;






int main()


{


cv::Mat
srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");




if
(srcImage.empty())


{


return
-1;


}


cv::imshow("原图像",
srcImage);




//灰度转换


cv::Mat
srcGray;


cv::cvtColor(srcImage,
srcGray, CV_RGB2GRAY);


cv::imshow("srcGray",
srcGray);




cv::Mat
dstImage;




//初始化自适应阈值参数


int
blockSize =
5;


int
constValue =
20;


int
maxValue =
255;




//自适应阈值算法0:ADAPTIVE_THRESHOLD_MEAN_C,1:ADAPTIVE_GAUSSIAN_MEAN_C


//阈值类型,0:THRESHOLD_BINARY,1:THRESHOLD_BINARY_INV


int
adaptiveMthod =
0;


int
thresholdType =
1;




//图像自适应阈值操作


cv::adaptiveThreshold(srcGray,
dstImage, maxValue, adaptiveMthod,
thresholdType, blockSize, constValue);


cv::imshow("dstImage",
dstImage);




cv::waitKey(0);




//预设最大值


const
int maxVal
=
255;




return
0;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: