【OpenCV图像处理⼊门学习教程⼆】不同阈值⼆值化图像
OpenCV图像处理⼊门学习教程系列,上⼀篇第⼀篇:
图像⼆值化介绍
图像⼆值化是图像预处理中⾮常重要的⼀部分。图像⼆值化简单来说就是将256个亮度等级的灰度图像通过适当的阈值选取⽽获得仍然可以
反映图像整体和局部特征的⼆值化图像。
在数字图像处理中,⼆值图像占有⾮常重要的地位,⾸先,图像的⼆值化有利于图像的进⼀步处理,使图像变得简单,⽽且数据量减⼩,能
凸显出感兴趣的⽬标的轮廓。其次,要进⾏⼆值图像的处理与分析,⾸先要把灰度图像⼆值化,得到⼆值化图像。
⼀、OpenCV中的图像⼆值化
在OpenCV中,图像⼆值化最关键的⼀个函数就是——cvThreshold()
下⾯简单地介绍⼀下这个函数,有关该函数的具体定义与说明,可以在OpenCV的imgproctypes_c.h中找到。
该函数的主要功能就是,采⽤Canny⽅法对图像进⾏边缘检测
函数原型及说明如下:
voidcvThreshold(//函数说明:
constCvArr*src,//第⼀个参数表⽰输⼊图像,必须为单通道灰度图。
CvArr*dst,//第⼆个参数表⽰输出的边缘图像,为单通道⿊⽩图。
doublethreshold,//第三个参数表⽰阈值
doublemax_value,//第四个参数表⽰最⼤值。
intthreshold_type//第五个参数表⽰运算⽅法。
);
上述的第五个参数也就是Thresholdtypes如下:
/*Thresholdtypes↓*/
enum
{CV_THRESH_BINARY=0,/*value=value>threshold?max_value:0*/
CV_THRESH_BINARY_INV=1,/*value=value>threshold?0:max_value*/
CV_THRESH_TRUNC=2,/*value=value>threshold?threshold:value*/
CV_THRESH_TOZERO=3,/*value=value>threshold?value:0*/
CV_THRESH_TOZERO_INV=4,/*value=value>threshold?0:value*/
CV_THRESH_MASK=7,
CV_THRESH_OTSU=8/*uOtsualgorithmtochootheoptimalthresholdvalue;combinetheflagwithoneoftheaboveCV_THRESH_*values*/
//最后⼀个是⾃适应算法取阈值(最⼤类间⽅差法),这样前⾯的第四个参数threshold会⽆效
};
⼆、基于OpenCV3.3的图像⼆值化(阈值可调)
下⾯是⼀段基于OpenCV3.3的图像⼆值化实例代码,阈值可以通过滑动条来调节,可以观察不同阈值:
IDEIDE:VisualStudio2013
语⾔语⾔:C++
依赖依赖:OpenCV3.3.0
整个⼯程⽂件见
#include<>
usingnamespacestd;
IplImage*g_pGrayImage=NULL;
IplImage*g_pBinaryImage=NULL;
constchar*pstrWindowsBinaryTitle="⼆值化之后的图像";
voidon_trackbar(intval)
{
//转为⼆值图
cvThreshold(g_pGrayImage,g_pBinaryImage,val,255,CV_THRESH_BINARY);
//显⽰⼆值图
cvShowImage(pstrWindowsBinaryTitle,g_pBinaryImage);
}
intmain(intargc,char**argv)
{
constchar*pstrWindowsSrcTitle="原图-byLenna";
constchar*pstrWindowsToolBarName="⼆值化阈值";
//从⽂件中加载原图
IplImage*pSrcImage=cvLoadImage("",CV_LOAD_IMAGE_UNCHANGED);
//转为灰度图Gray=R*0.299+G*0.587+B*0.114(通道顺序B->G->R)
g_pGrayImage=cvCreateImage(cvGetSize(pSrcImage),IPL_DEPTH_8U,1);
cvCvtColor(pSrcImage,g_pGrayImage,CV_BGR2GRAY);
//创建⼆值图
g_pBinaryImage=cvCreateImage(cvGetSize(g_pGrayImage),IPL_DEPTH_8U,1);
//显⽰原图
cvNamedWindow(pstrWindowsSrcTitle,CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle,pSrcImage);
//创建⼆值图窗⼝
cvNamedWindow(pstrWindowsBinaryTitle,CV_WINDOW_AUTOSIZE);
//滑动条
intnThreshold=63;
cvCreateTrackbar(pstrWindowsToolBarName,pstrWindowsBinaryTitle,&nThreshold,254,on_trackbar);
on_trackbar(63);//初始阈值的设置,初步调试设为63
cvWaitKey(0);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsBinaryTitle);
cvReleaImage(&pSrcImage);
cvReleaImage(&g_pGrayImage);
cvReleaImage(&g_pBinaryImage);
return0;
}
运⾏结果如下:
⼤家可以再拉⼀拉滑动条,看看不同的阈值⼆值化出来的图⽚怎么样~上图的值私以为是看起来⽐较舒服的~
当然除了cvThreshold()这个函数以外,OpenCV中还提供了cvAdaptiveThreshold()函数以及cvCanny()函数也是可以对图像进⾏⼆值化
的,⽽cvAdaptiveThreshold()函数会使⽤Otsu算法(⼤律法或最⼤类间⽅差法)来进⾏⾃适应全局阈值,通过这个阈值对图像进⾏⼆值化,
效果是和在调⽤cvThreshold()时传⼊参数CV_THRESH_OTSU是⼀样的,⼤家可以⾃⼰试⼀试~
基于OpenCV3.3的图像⼆值化(阈值可调),整个⼯程⽂件见
OpenCV图像处理⼊门学习教程系列,下⼀篇第三篇:
本文发布于:2022-12-07 18:46:47,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/61241.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |