书上已经讲得很细了,直接贴出来了
1 //图像的二值化
2 //By MoreWindows (http://blog.***.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.***.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.***
.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位
第三个参数设置阈值,越大则黑色的区域越大,否则反之,第四个参数越大白色的区域越白。
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。