圖像的二值化


書上已經講得很細了,直接貼出來了

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM