图像的二值化
书上已经讲得很细了,直接贴出来了
直接上代码(来自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位
第三个参数设置阈值,越大则黑色的区域越大,否则反之,第四个参数越大白色的区域越白。
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!