書上已經講得很細了,直接貼出來了
直接上代碼(來自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位
第三個參數設置閾值,越大則黑色的區域越大,否則反之,第四個參數越大白色的區域越白。