Skip to content

Commit b891ce2

Browse files
committed
Merge pull request #181 from samyak-268:master
2 parents fc0ada7 + e226d78 commit b891ce2

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

modules/ximgproc/include/opencv2/ximgproc.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,13 @@ which somehow takes into account pixel affinities in natural images.
6363
@}
6464
*/
6565

66+
namespace cv {
67+
namespace ximgproc {
68+
CV_EXPORTS_W
69+
void niBlackThreshold( InputArray _src, OutputArray _dst, double maxValue,
70+
int type, int blockSize, double delta );
71+
72+
} // namespace ximgproc
73+
} //namespace cv
74+
6675
#endif
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Sample C++ to demonstrate Niblack thresholding.
3+
*
4+
*/
5+
6+
#include <iostream>
7+
#include <cstdio>
8+
9+
#include "opencv2/highgui.hpp"
10+
#include "opencv2/core.hpp"
11+
#include "opencv2/imgproc.hpp"
12+
13+
#include "opencv2/ximgproc.hpp"
14+
15+
using namespace std;
16+
using namespace cv;
17+
using namespace cv::ximgproc;
18+
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;
24+
25+
void on_trackbar(int, void*);
26+
27+
int main(int argc, char** argv)
28+
{
29+
/*
30+
* Read filename from the command-line and load
31+
* corresponding gray-scale image.
32+
*/
33+
if(argc != 2)
34+
{
35+
cout << "Usage: ./niblack_thresholding [IMAGE]\n";
36+
return 1;
37+
}
38+
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+
46+
imshow("Source", src);
47+
waitKey(0);
48+
49+
return 0;
50+
}
51+
52+
void on_trackbar(int, void*)
53+
{
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);
58+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*M///////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4+
//
5+
// By downloading, copying, installing or using the software you agree to this license.
6+
// If you do not agree to this license, do not download, install,
7+
// copy or use the software.
8+
//
9+
//
10+
// License Agreement
11+
// For Open Source Computer Vision Library
12+
//
13+
// Copyright (C) 2014, Beat Kueng ([email protected]), Lukas Vogel, Morten Lysgaard
14+
// Third party copyrights are property of their respective owners.
15+
//
16+
// Redistribution and use in source and binary forms, with or without modification,
17+
// are permitted provided that the following conditions are met:
18+
//
19+
// * Redistribution's of source code must retain the above copyright notice,
20+
// this list of conditions and the following disclaimer.
21+
//
22+
// * Redistribution's in binary form must reproduce the above copyright notice,
23+
// this list of conditions and the following disclaimer in the documentation
24+
// and/or other materials provided with the distribution.
25+
//
26+
// * The name of the copyright holders may not be used to endorse or promote products
27+
// derived from this software without specific prior written permission.
28+
//
29+
// This software is provided by the copyright holders and contributors "as is" and
30+
// any express or implied warranties, including, but not limited to, the implied
31+
// warranties of merchantability and fitness for a particular purpose are disclaimed.
32+
// In no event shall the Intel Corporation or contributors be liable for any direct,
33+
// indirect, incidental, special, exemplary, or consequential damages
34+
// (including, but not limited to, procurement of substitute goods or services;
35+
// loss of use, data, or profits; or business interruption) however caused
36+
// and on any theory of liability, whether in contract, strict liability,
37+
// or tort (including negligence or otherwise) arising in any way out of
38+
// the use of this software, even if advised of the possibility of such damage.
39+
//
40+
//M*/
41+
42+
43+
#include "precomp.hpp"
44+
#include <cmath>
45+
46+
namespace cv {
47+
namespace ximgproc {
48+
49+
void niBlackThreshold( InputArray _src, OutputArray _dst, double maxValue,
50+
int type, int blockSize, double delta )
51+
{
52+
Mat src = _src.getMat();
53+
CV_Assert( src.type() == CV_8UC1 );
54+
CV_Assert( blockSize % 2 == 1 && blockSize > 1 );
55+
Size size = src.size();
56+
57+
_dst.create( size, src.type() );
58+
Mat dst = _dst.getMat();
59+
60+
if( maxValue < 0 )
61+
{
62+
dst = Scalar(0);
63+
return;
64+
}
65+
66+
// Calculate and store the mean and mean of squares in the neighborhood
67+
// of each pixel and store them in Mat mean and sqmean.
68+
Mat_<float> mean(size), sqmean(size);
69+
70+
if( src.data != dst.data )
71+
mean = dst;
72+
73+
boxFilter( src, mean, CV_64F, Size(blockSize, blockSize),
74+
Point(-1,-1), true, BORDER_REPLICATE );
75+
sqrBoxFilter( src, sqmean, CV_64F, Size(blockSize, blockSize),
76+
Point(-1,-1), true, BORDER_REPLICATE );
77+
78+
// Compute (k * standard deviation) in the neighborhood of each pixel
79+
// and store in Mat stddev. Also threshold the values in the src matrix to compute dst matrix.
80+
Mat_<float> stddev(size);
81+
int i, j, threshold;
82+
uchar imaxval = saturate_cast<uchar>(maxValue);
83+
for(i = 0; i < size.height; ++i)
84+
{
85+
for(j = 0; j < size.width; ++j)
86+
{
87+
stddev.at<float>(i, j) = saturate_cast<float>(delta) * cvRound( sqrt(sqmean.at<float>(i, j) -
88+
mean.at<float>(i, j)*mean.at<float>(i, j)) );
89+
threshold = cvRound(mean.at<float>(i, j) + stddev.at<float>(i, j));
90+
if(src.at<uchar>(i, j) > threshold)
91+
dst.at<uchar>(i, j) = (type == THRESH_BINARY) ? imaxval : 0;
92+
else
93+
dst.at<uchar>(i, j) = (type == THRESH_BINARY) ? 0 : imaxval;
94+
}
95+
}
96+
97+
}
98+
99+
} // namespace ximgproc
100+
} //namespace cv

0 commit comments

Comments
 (0)