对图像进行二值化的关键函数为cvThreshold
,它采用Canny
方法对图像进行边缘检测:
void cvThreshold (
const CvArr *src, CvArr *dst, double threshold,
double max_value, int threshold_type );
参数src
表示输入图像,必须为单通道灰度图;参数dst
表示输出的边缘图像,为单通道黑白图;参数threshold
表示阈值;参数max_value
表示最大值;参数threshold_type
表示运算方法,在OpenCV
的imgproc\types_c.h
中可以找到运算方法的定义:
enum {
CV_THRESH_BINARY = 0,
CV_THRESH_BINARY_INV = 1,
CV_THRESH_TRUNC = 2,
CV_THRESH_TOZERO = 3,
CV_THRESH_TOZERO_INV = 4,
CV_THRESH_MASK = 7,
CV_THRESH_OTSU = 8
};
代码如下:
#include <opencv2/opencv.hpp>
IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图";
void on_trackbar ( int pos ) {
cvThreshold ( g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY );
cvShowImage ( pstrWindowsBinaryTitle, g_pBinaryImage );
}
int main ( int argc, char **argv ) {
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsToolBarName = "二值图阈值";
IplImage *pSrcImage = cvLoadImage ( "zzjb.jpg", CV_LOAD_IMAGE_UNCHANGED );
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 );
int nThreshold = 0;
cvCreateTrackbar ( pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar );
on_trackbar ( 1 );
cvWaitKey ( 0 );
cvDestroyWindow ( pstrWindowsSrcTitle );
cvDestroyWindow ( pstrWindowsBinaryTitle );
cvReleaseImage ( &pSrcImage );
cvReleaseImage ( &g_pGrayImage );
cvReleaseImage ( &g_pBinaryImage );
return 0;
}
OpenCV
还有个cvAdaptiveThreshold
函数,这个函数会使用Otsu
算法(大律法或最大类间方差法)来计算出一个全局阈值,然后根据这个阈值进行二值化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)