OpenCV⾃适应阈值化函数adaptiveThreshold详解,并附实例
源码!
图像阈值化的⼀般⽬的是从灰度图像中分享⽬标区域和背景区域,然⽽仅仅通过设定固定阈值()很难达到理想的分割效果。在实际应⽤中,我们可以通过某个像素的邻域以某种⽅法确定这个像素应该具有的阈值,进⽽保证图像中各个像素的阈值会随着周期围邻域块的变化⽽变化。在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成⼀⼩块⼀⼩块的去计算阈值往往会得出图像的轮廓,⽽固定阈值的⽅法就不⾏,可以把本⽂的结果和⽤固定阈值法进⾏⼆值化的结果作下对⽐,很容易发现这⼀点!(我下⾯作了对⽐哦)
OpenCV中提供了⾃适应阈值化函数adaptiveThreshold来实现⾃适应阈值处理、
函数adaptiveThreshold的原型如下:
C++: void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
这⾥我对各参数作⼀个中⽂说明!
InputArray src:源图像
OutputArray dst:输出图像,与源图像⼤⼩⼀致
int adaptiveMethod:在⼀个邻域内计算阈值所采⽤的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和
ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算⽅法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算⽅法是计算出领域的⾼斯均值再减去第七个参数double C的值
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官⽅的说明,这⾥不多做解释
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多⼤,就由这个值作决定
double C:在对参数int adaptiveMethod的说明中,我已经说了这个参数的作⽤,从中可以看出,这个参数实际上是⼀个偏移值调整量
从上⾯的说明中可以看出,使⽤函数adaptiveThreshold的关键是确定blockSize和C的值,明⽩了这两个值的意义之后,在实际项⽬中,应该可以根据试验法选出较为合适的值吧!
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索"qxsf321",并关注!
//OpenCV版本2.4.9
adaptive#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int main( )
{
// 图像读取及判断
cv::Mat srcImage = cv::imread("hand1.jpg");
if( !srcImage.data )
return 1;
// 灰度转换
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY); cv::imshow("srcGray", srcGray);
cv::Mat dstImage;
// 初始化⾃适应阈值参数
int blockSize = 5;
int constValue = 10;
const int maxVal = 255;
/* ⾃适应阈值算法
0:ADAPTIVE_THRESH_MEAN_C
1: ADAPTIVE_THRESH_GAUSSIAN_C
阈值类型
0: THRESH_BINARY
1: THRESH_BINARY_INV */
int adaptiveMethod = 0;
int thresholdType = 1;
// 图像⾃适应阈值操作
cv::adaptiveThreshold(srcGray, dstImage,
maxVal, adaptiveMethod,
thresholdType, blockSize,
constValue);
cv::imshow("dstImage", dstImage);
cv::waitKey(0);
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论