|
1 | 1 | /* |
2 | | - * Sample C++ to demonstrate Niblack thresholding. |
3 | | - * |
| 2 | + * C++ sample to demonstrate Niblack thresholding. |
4 | 3 | */ |
5 | 4 |
|
6 | 5 | #include <iostream> |
7 | | -#include <cstdio> |
8 | | - |
9 | | -#include "opencv2/highgui.hpp" |
10 | 6 | #include "opencv2/core.hpp" |
| 7 | +#include "opencv2/highgui.hpp" |
11 | 8 | #include "opencv2/imgproc.hpp" |
12 | | - |
13 | 9 | #include "opencv2/ximgproc.hpp" |
14 | 10 |
|
15 | 11 | using namespace std; |
16 | 12 | using namespace cv; |
17 | 13 | using namespace cv::ximgproc; |
18 | 14 |
|
19 | | -Mat_<uchar> src, dst; |
20 | | - |
21 | | -const int k_max_value = 10; |
22 | | -int k_from_slider = 0; |
23 | | -double k_actual = 0.0; |
| 15 | +Mat_<uchar> src; |
| 16 | +int k_ = 8; |
| 17 | +int blockSize_ = 11; |
| 18 | +int type_ = THRESH_BINARY; |
24 | 19 |
|
25 | 20 | void on_trackbar(int, void*); |
26 | 21 |
|
27 | 22 | int main(int argc, char** argv) |
28 | 23 | { |
29 | | - /* |
30 | | - * Read filename from the command-line and load |
31 | | - * corresponding gray-scale image. |
32 | | - */ |
| 24 | + // read gray-scale image |
33 | 25 | if(argc != 2) |
34 | 26 | { |
35 | 27 | cout << "Usage: ./niblack_thresholding [IMAGE]\n"; |
36 | 28 | return 1; |
37 | 29 | } |
38 | 30 | const char* filename = argv[1]; |
39 | | - src = imread(filename, 1); |
40 | | - |
41 | | - namedWindow("k-slider", 1); |
42 | | - string trackbar_name = "k"; |
43 | | - createTrackbar(trackbar_name, "k-slider", &k_from_slider, k_max_value, on_trackbar); |
44 | | - on_trackbar(k_from_slider, 0); |
45 | | - |
| 31 | + src = imread(filename, IMREAD_GRAYSCALE); |
46 | 32 | imshow("Source", src); |
| 33 | + |
| 34 | + namedWindow("Niblack", WINDOW_AUTOSIZE); |
| 35 | + createTrackbar("k", "Niblack", &k_, 20, on_trackbar); |
| 36 | + createTrackbar("blockSize", "Niblack", &blockSize_, 30, on_trackbar); |
| 37 | + createTrackbar("threshType", "Niblack", &type_, 4, on_trackbar); |
| 38 | + on_trackbar(0, 0); |
47 | 39 | waitKey(0); |
48 | 40 |
|
49 | 41 | return 0; |
50 | 42 | } |
51 | 43 |
|
52 | 44 | void on_trackbar(int, void*) |
53 | 45 | { |
54 | | - k_actual = (double)k_from_slider/k_max_value; |
55 | | - niBlackThreshold(src, dst, 255, THRESH_BINARY, 3, k_actual); |
56 | | - |
57 | | - imshow("Destination", dst); |
| 46 | + double k = static_cast<double>(k_-10)/10; // [-1.0, 1.0] |
| 47 | + int blockSize = 2*(blockSize_ >= 1 ? blockSize_ : 1) + 1; // 3,5,7,...,61 |
| 48 | + int type = type_; // THRESH_BINARY, THRESH_BINARY_INV, |
| 49 | + // THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV |
| 50 | + Mat dst; |
| 51 | + niBlackThreshold(src, dst, 255, type, blockSize, k); |
| 52 | + imshow("Niblack", dst); |
58 | 53 | } |
0 commit comments