图像的二值化

书上已经讲得很细了,直接贴出来了

直接上代码(来自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位
第三个参数设置阈值,越大则黑色的区域越大,否则反之,第四个参数越大白色的区域越白。

原文地址:https://www.cnblogs.com/henuliulei/p/10616849.html