书上已经讲得很细了,直接贴出来了
直接上代码(来自https://blog.csdn.net/MoreWindows)
1 //图像的二值化 2 //By MoreWindows (http://blog.csdn.net/MoreWindows) 3 #include<iostream> 4 #include <opencv2/core/core.hpp> 5 #include <opencv2/opencv.hpp> 6 #include <opencv2/highgui/highgui.hpp> 7 #include <opencv2/highgui/highgui_c.h> 8 #include "opencv2/imgproc/imgproc_c.h" 9 #include <opencv2/imgproc/imgproc.hpp> 10 using namespace cv; 11 using namespace std; 12 #pragma comment(linker, "/subsystem:"windows" /entry:"mainCRTStartup"") 13 14 IplImage *g_pGrayImage = NULL; 15 IplImage *g_pBinaryImage = NULL; 16 const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)"; 17 18 void on_trackbar(int pos) 19 { 20 // 转为二值图 21 cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY); 22 // 显示二值图 23 cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage); 24 } 25 26 int main(int argc, char** argv) 27 { 28 const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)"; 29 const char *pstrWindowsToolBarName = "二值图阈值"; 30 31 // 从文件中加载原图 32 IplImage *pSrcImage = cvLoadImage("D:/picture/ZiXia.jpg", CV_LOAD_IMAGE_UNCHANGED); 33 34 // 转为灰度图 35 g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); 36 cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY); 37 38 // 创建二值图 39 g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1); 40 41 // 显示原图 42 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); 43 cvShowImage(pstrWindowsSrcTitle, pSrcImage); 44 // 创建二值图窗口 45 cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE); 46 47 // 滑动条 48 int nThreshold = 0; 49 cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar); 50 51 on_trackbar(1); 52 53 cvWaitKey(0); 54 55 cvDestroyWindow(pstrWindowsSrcTitle); 56 cvDestroyWindow(pstrWindowsBinaryTitle); 57 cvReleaseImage(&pSrcImage); 58 cvReleaseImage(&g_pGrayImage); 59 cvReleaseImage(&g_pBinaryImage); 60 return 0; 61 }
(注;opencv4.0以上可能无法运行,部分函数可能找不到,反正在我的vs上cvloadimage一直爆红)
这是另一个实现二值化的代码,如下,可以成功运行
1 //对一幅图像进行二值化 2 #include<iostream> 3 #include <opencv2/core/core.hpp> 4 #include <opencv2/opencv.hpp> 5 #include <opencv2/highgui/highgui.hpp> 6 #include <opencv2/highgui/highgui_c.h> 7 #include "opencv2/imgproc/imgproc_c.h" 8 #include <opencv2/imgproc/imgproc.hpp> 9 using namespace cv; 10 using namespace std; 11 12 13 int main() 14 { 15 Mat imag, result; 16 imag = imread("D:/picture/ZiXia.jpg", 0); //将读入的彩色图像直接以灰度图像读入 17 namedWindow("原图", 1); 18 imshow("原图", imag); 19 result = imag.clone(); 20 //进行二值化处理,选择30,200.0为阈值 21 threshold(imag, result, 30, 200.0, -1); 22 namedWindow("二值化图像"); 23 imshow("二值化图像", result); 24 waitKey(); 25 return 0; 26 }
相比于第二个代码,第一个代码运行时可以动态调整阈值,且阈值越大黑色区域更多,运行效果更好体现了阈值的含义,不过这两个代码的核心函数都是threshold();
对于该函数
函数原型
参数说明
src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
dst:输出图像
thresh:阈值
maxval:dst图像中最大值
type:阈值类型,可以具体类型如下:
编号
阈值类型枚举
注意
1
THRESH_BINARY
2
THRESH_BINARY_INV
3
THRESH_TRUNC
4
THRESH_TOZERO
5
THRESH_TOZERO_INV
6
THRESH_MASK
不支持
7
THRESH_OTSU
不支持32位
8
THRESH_TRIANGLE
不支持32位
第三个参数设置阈值,越大则黑色的区域越大,否则反之,第四个参数越大白色的区域越白。